`
java-mans
  • 浏览: 11431147 次
文章分类
社区版块
存档分类
最新评论

二叉查询树三种遍历的非递归写法 [No. 78]

 
阅读更多

这里写出三种儿叉查询树遍历的非递归写法,非常有意思。

preorder:先打印root,再left,最后right。

    public static void BSTPreorderTraverse(Node node) {
    	if (node == null) {
    		return;
    	}
    	Stack<Node> s = new Stack<Node>();
    	s.push(node);
    	while (!s.empty()) {
    		node = s.pop();
    		System.out.println(node.toString());
    		if (node.rightChild != null) {s.push(node.rightChild);}
    		if (node.leftChild != null) {s.push(node.leftChild);}
    	}
    }

Inorder: 先打印left,再root,最后right.

public static void BSTInorderTraverse(Node node) {
	Stack<Node> s = new Stack<Node>();
	while (!s.empty() || node != null) {
		if (node != null) {
			s.push(node);
			node = node.leftChild;
		} else {
			node = s.pop();
    		System.out.println(node.toString());
    		node = node.rightChild;
		}
	}
}

Postorder: 先打印left,再right,最后root.

public static void BSTPostorderTraverse(Node node) {
	if (node == null) {
		return;
	}
	Stack<Node> s = new Stack<Node>();
	
	Node cur = node;
	
	while (true) {
		if (cur != null) {
			if (cur.rightChild != null) {
				s.push(cur.rightChild);
			}
			
			s.push(cur);
			cur = cur.leftChild;
			continue;
		}
		
		if (s.empty()) {
			return;
		}
		
		cur = s.pop();
		if (cur.rightChild != null && !s.empty() && cur.rightChild == s.peek()) {
			s.pop();
			s.push(cur);
			cur = cur.rightChild;
		} else {
			System.out.println(cur.toString());
			cur = null;
		}
		
	}
}

class Node {
    Node leftChild = null;
    Node rightChild = null;
    String name;

    Node(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}

参考:http://en.wikipedia.org/wiki/Inorder

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics