Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2018, 12:39   #1
Nastya2018
Форумчанин
 
Регистрация: 24.07.2018
Сообщений: 133
По умолчанию Рекурсия

Приветвсем) как на месте вопроса написать функцию рекурсии чтобы вывело все элементы дерева

Код:
package tree;
 
class Main {
 
    public static void main(String[] args) {
        TreeNode<String> treeRoot = getSet1();
        
        printTree(treeRoot);
        
        /*for (TreeNode<String> node : treeRoot) {
            String indent = createIndent(node.getLevel());
            System.out.println(indent + node.data);
        }*/
    }
 
    public static void printTree(TreeNode<String> tree) {
 
????????????????????????????????????????????????????????? - как здесь написать рекурсию 
        
    }
    
    private static String createIndent(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append(' ');
        }
        return sb.toString();
    }
 
    public static TreeNode<String> getSet1() {
        TreeNode<String> root = new TreeNode<>("root");
 
        TreeNode<String> node0 = root.addChild("Video");
        TreeNode<String> node1 = root.addChild("Music");
        TreeNode<String> node2 = root.addChild("Pictures");
 
        TreeNode<String> node00 = node0.addChild("Terminator");
        TreeNode<String> node01 = node0.addChild("Baffi");
        TreeNode<String> node02 = node0.addChild("Harry Potter");
        TreeNode<String> node03 = node1.addChild("Kreed");
        TreeNode<String> node04 = node1.addChild("Buzova");
        TreeNode<String> node05 = node1.addChild("Lana Del Rey");
        TreeNode<String> node06 = node2.addChild("Books");
        TreeNode<String> node07 = node2.addChild("Mona Lisa");
        TreeNode<String> node08 = node2.addChild("Picasso");
        
        
        TreeNode<String> node09 = node08.addChild("Picasso1");
        TreeNode<String> node10 = node08.addChild("Picasso2");
 
        return root;
 
    }
}

Последний раз редактировалось Nastya2018; 17.08.2018 в 12:44.
Nastya2018 вне форума Ответить с цитированием
Старый 17.08.2018, 12:55   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Стандартно. Определить, что будет являться остановкой и вызвать для всех детей себя.
p51x вне форума Ответить с цитированием
Старый 17.08.2018, 12:56   #3
Nastya2018
Форумчанин
 
Регистрация: 24.07.2018
Сообщений: 133
По умолчанию

Можете пожалуйста помочь написать код(
Nastya2018 вне форума Ответить с цитированием
Старый 17.08.2018, 12:59   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вы не можете вызвать эту же функцию для всех "детей"? Или вы этот код скопипастили и даже с используемыми классами не ознакомились https://docs.oracle.com/javase/7/doc.../TreeNode.html ?
p51x вне форума Ответить с цитированием
Старый 17.08.2018, 13:00   #5
Nastya2018
Форумчанин
 
Регистрация: 24.07.2018
Сообщений: 133
По умолчанию

который раз убеждаюсь, что тут никто не помогает, всегда сама где то нахожу или делаю решение по своему. Тут умеют только болтать, либо кидать ссылку. А помочь, что то спросить поняла толку нету
Nastya2018 вне форума Ответить с цитированием
Старый 17.08.2018, 13:02   #6
Nastya2018
Форумчанин
 
Регистрация: 24.07.2018
Сообщений: 133
По умолчанию

другие классы
Код:
package tree;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class TreeNode<T> /*implements Iterable<TreeNode<T>>*/ {

	public T data;
	public TreeNode<T> parent;
	public List<TreeNode<T>> children;

	public boolean isRoot() {
		return parent == null;
	}

	public boolean isLeaf() {
		return children.size() == 0;
	}

	private List<TreeNode<T>> elementsIndex;

	public TreeNode(T data) {
		this.data = data;
		this.children = new LinkedList<TreeNode<T>>();
		this.elementsIndex = new LinkedList<TreeNode<T>>();
		this.elementsIndex.add(this);
	}

	public TreeNode<T> addChild(T child) {
		TreeNode<T> childNode = new TreeNode<T>(child);		
		this.children.add(childNode);
                
                childNode.parent = this;
                
		//this.registerChildForSearch(childNode);
		return childNode;
	}

	public int getLevel() {
		if (this.isRoot())
			return 0;
		else
			return parent.getLevel() + 1;
	}

	private void registerChildForSearch(TreeNode<T> node) {
		elementsIndex.add(node);
		if (parent != null)
			parent.registerChildForSearch(node);
	}

	public TreeNode<T> findTreeNode(Comparable<T> cmp) {
		for (TreeNode<T> element : this.elementsIndex) {
			T elData = element.data;
			if (cmp.compareTo(elData) == 0)
				return element;
		}

		return null;
	}

	@Override
	public String toString() {
		return data != null ? data.toString() : "[data null]";
	}

	/*@Override
	public Iterator<TreeNode<T>> iterator() {
		TreeNodeIter<T> iter = new TreeNodeIter<T>(this);
		return iter;
	}*/

}
Код:
package tree;


import java.util.Iterator;

public class TreeNodeIter<T> implements Iterator<TreeNode<T>> {

	enum ProcessStages {
		ProcessParent, ProcessChildCurNode, ProcessChildSubNode
	}

	private TreeNode<T> treeNode;

	public TreeNodeIter(TreeNode<T> treeNode) {
		this.treeNode = treeNode;
		this.doNext = ProcessStages.ProcessParent;
		this.childrenCurNodeIter = treeNode.children.iterator();
	}

	private ProcessStages doNext;
	private TreeNode<T> next;
	private Iterator<TreeNode<T>> childrenCurNodeIter;
	private Iterator<TreeNode<T>> childrenSubNodeIter;

	@Override
	public boolean hasNext() {

		if (this.doNext == ProcessStages.ProcessParent) {
			this.next = this.treeNode;
			this.doNext = ProcessStages.ProcessChildCurNode;
			return true;
		}

		if (this.doNext == ProcessStages.ProcessChildCurNode) {
			if (childrenCurNodeIter.hasNext()) {
				TreeNode<T> childDirect = childrenCurNodeIter.next();
				childrenSubNodeIter = childDirect.iterator();
				this.doNext = ProcessStages.ProcessChildSubNode;
				return hasNext();
			}

			else {
				this.doNext = null;
				return false;
			}
		}
		
		if (this.doNext == ProcessStages.ProcessChildSubNode) {
			if (childrenSubNodeIter.hasNext()) {
				this.next = childrenSubNodeIter.next();
				return true;
			}
			else {
				this.next = null;
				this.doNext = ProcessStages.ProcessChildCurNode;
				return hasNext();
			}
		}

		return false;
	}

	@Override
	public TreeNode<T> next() {
		return this.next;
	}

	@Override
	public void remove() {
		throw new UnsupportedOperationException();
	}

}
Nastya2018 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия sergey 777 Паскаль, Turbo Pascal, PascalABC.NET 1 16.11.2014 09:59
Рекурсия AZelensky Общие вопросы Delphi 3 19.04.2014 10:22
рекурсия Lena neznayka Помощь студентам 2 16.06.2010 20:46
Рекурсия Solnze2 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2010 09:28
рекурсия shelest Помощь студентам 3 14.04.2010 10:12