二叉樹非遞迴遍歷方法總結
阿新 • • 發佈:2018-12-31
以前只會二叉樹的一種非遞迴遍歷,最近又看了二叉樹的多種非遞迴遍歷方式,感覺很有用,親自實現用理解了一番,總結如下。
一、常用方式
1、先序遍歷
1.1 自己常用的一種方式:
public List<Integer> preOrder1(TreeNode root) { List<Integer> list = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); stack.push(root); TreeNode node = null; while (!stack.isEmpty()) { node = stack.pop(); if (node != null) { list.add(node.value); stack.push(node.right); stack.push(node.left); } } return list; }
public List<Integer> preOrder2(TreeNode root) { List<Integer> list = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); TreeNode node = root; while (!stack.isEmpty() || node !=null) { if(node != null){ list.add(node.value); stack.push(node); node = node.left; } else { node = stack.pop(); node = node.right; } } return list; }
2、中序遍歷
public List<Integer> inOrder1(TreeNode root) { List<Integer> list = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); TreeNode node = root; while (!stack.isEmpty() || node !=null) { if(node != null){ stack.push(node); node = node.left; } else { node = stack.pop(); list.add(node.value); node = node.right; } } return list; }
3、後序遍歷
public List<Integer> postOrder(Node root) {
List<Integer> res = new ArrayList<>();
Stack<Node> stack = new Stack<>();
stack.push(root);
Node node = null;
Node pre = null; //訪問的前一個元素
while(!stack.isEmpty()) {
node = stack.peek();
if(node != null) {
if(node.left != null && node.left != pre && node.right != pre) {
stack.push(node.left);
} else if(node.right != null && node.right != pre) {
stack.push(node.right);
} else {
res.add(node.value);
pre = stack.pop(); //此時 node = stack.pop();
}
}
}
return res;
}