二叉树的三种遍历方式:
1.给定一个二叉树,返回它的前序遍历。root-left-right
递归实现:
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>(); //每次遍历都会产生一个新的list对象
if(root == null) {
return list;
}
System.out.print(root.val + " ");
list.add(root.val);
List<Integer> list1 = preorderTraversal(root.left);
list.addAll(list1);
List<Integer> list2 = preorderTraversal(root.right);
list.addAll(list2);
return list;
}
非递归实现:
思路分析:【栈实现】 往左走,每走一次,cur不为空打印并入栈;为空拿到栈顶元素,cur= cur.right。
void preOrderTraversalNor(TreeNode root) {
Stack<TreeNode > stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.empty()) {
while (cur != null) {
stack.push(cur);
System.out.print(cur.value + " ");
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
}
List<Character> preOrderTraversalNor2(TreeNode root) {
List<Character> list = new ArrayList<>();
Stack<TreeNode > stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.empty()) {
while (cur != null) {
stack.push(cur);
System.out.print(cur.value + " ");
list.add(cur.value);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
return list;
}
2.给定一个二叉树,返回它的中序遍历。left-root-right
递归实现:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root == null) {
return list;
}
List<Integer> list1 = inorderTraversal(root.left);
list.addAll(list1);
System.out.print(root.val + " ");
list.add(root.val);
List<Integer> list2 = inorderTraversal(root.right);
list.addAll(list2);
return list;
}
非递归实现:只是和前序遍历add的位置不同。
List<Character> preOrderTraversalNor2(TreeNode root) {
List<Character> list = new ArrayList<>();
Stack<TreeNode > stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.empty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
list.add(cur.value);
cur = cur.right;
}
return list;
}
3.给定一个二叉树,返回它的后序遍历。 left-right-root
递归实现:
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root == null) {
return list;
}
List<Integer> list1 = postorderTraversal(root.left);
list.addAll(list1);
List<Integer> list2 = postorderTraversal(root.right);
list.addAll(list2);
System.out.print(root.val + " ");
list.add(root.val);
return list;
}
非递归实现:【栈实现】
void postOrderTraversalnNor(TreeNode root) {
Stack<TreeNode > stack = new Stack<>