二叉树的前中后序遍历

简介: 二叉树的前中后序遍历

二叉树的前序遍历

二叉树的前序遍历的记忆法则是“根左右",即先遍历根节点,再遍历左子树节点,再遍历右子树节点。

如图所示:

其遍历结果为【A, B, D, E, C, F, G】

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

数据范围:二叉树的节点数量满足1≤n≤100 ,二叉树节点的值满足1≤val≤100,树的各节点的值各不相同

示例 1:

1. 输入:
2. {1,#,2,3}
3. 返回值:
4. [1,2,3]

一、解题思路:递归

1. public class Solution {
2. 
3.     List<Integer> list = new ArrayList<>();
4. 
5. public int[] preorderTraversal (TreeNode root) {
6.         List<Integer> list = preOrder(root);
7. int[] res = new int[list.size()];
8. for (int i = 0; i < list.size(); i++) {
9.             res[i] = list.get(i);
10.         }
11. return res;
12.     }
13. 
14.     List<Integer> preOrder(TreeNode node) {
15. if (node == null) {
16. return list;
17.         }
18.         list.add(node.val);
19.         preOrder(node.left);
20.         preOrder(node.right);
21. return list;
22.     }
23. }

二、解题思路:迭代

1. import java.util.*;
2. 
3. /*
4.  * public class TreeNode {
5.  *   int val = 0;
6.  *   TreeNode left = null;
7.  *   TreeNode right = null;
8.  *   public TreeNode(int val) {
9.  *     this.val = val;
10.  *   }
11.  * }
12.  */
13. 
14. public class Solution {
15. /**
16.      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
17.      *
18.      * 
19.      * @param root TreeNode类 
20.      * @return int整型一维数组
21.      */
22. public int[] preorderTraversal (TreeNode root) {
23. // 结果集合
24.         ArrayList<Integer> arr = new ArrayList();
25. if(root == null) {
26. return new int[0];
27.         }
28.         TreeNode current;
29. // LinkedList 当作栈来使用
30.         LinkedList<TreeNode> list = new LinkedList<TreeNode>();
31.         list.addFirst(root);
32. while(!list.isEmpty()) {
33.             current = list.removeFirst();
34.             arr.add(current.val);
35. if(current.right != null) {
36.                 list.addFirst(current.right);
37.             }
38. if(current.left != null) {
39.                 list.addFirst(current.left);
40.             }
41.         }
42. // 循环赋值。
43. int[] res = new int[arr.size()];
44. for(int i = 0; i < arr.size(); i++) {
45.             res[i] = arr.get(i);
46.         }
47. return res;
48.     }
49. }

二叉树的中序遍历

中序遍历是 二叉树遍历 的一种,也叫做 中根遍历 、中序周游。 在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。

给定一个二叉树的根节点root,返回它的中序遍历结果。

数据范围:树上节点数满足10000≤n≤1000,树上每个节点的值满足 −1000≤val≤1000

进阶:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

示例1:

1. 输入:
2. {1,2,#,#,3}
3. 返回值:
4. [2,3,1]

一、解题思路:递归

1. import java.util.*;
2. public class Solution {
3. public void inorder(List<Integer> list, TreeNode root){
4. //遇到空节点则返回
5. if(root == null) 
6. return;
7. //先去左子树
8.         inorder(list, root.left); 
9. //再访问根节点
10.         list.add(root.val); 
11. //最后去右子树
12.         inorder(list, root.right); 
13.     }
14. 
15. public int[] inorderTraversal (TreeNode root) {
16. //添加遍历结果的数组
17.         List<Integer> list = new ArrayList(); 
18. //递归中序遍历
19.         inorder(list, root); 
20. //返回的结果
21. int[] res = new int[list.size()]; 
22. for(int i = 0; i < list.size(); i++)
23.             res[i] = list.get(i);
24. return res;
25.     }
26. }

二、解题思路:迭代

1. import java.util.*;
2. public class Solution {
3. public int[] inorderTraversal (TreeNode root) {
4. //添加遍历结果的数组
5.         List<Integer> list = new ArrayList(); 
6.         Stack<TreeNode> s = new Stack<TreeNode>();
7. //空树返回空数组
8. if(root == null) 
9. return new int[0];
10. //当树节点不为空或栈中有节点时
11. while(root != null || !s.isEmpty()){ 
12. //每次找到最左节点
13. while(root != null){ 
14.                 s.push(root);
15.                 root = root.left;
16.             }
17. //访问该节点
18. TreeNode node = s.pop(); 
19.             list.add(node.val); 
20. //进入右节点
21.             root = node.right; 
22.         }
23. //返回的结果
24. int[] res = new int[list.size()]; 
25. for(int i = 0; i < list.size(); i++)
26.             res[i] = list.get(i);
27. return res;
28.     }
29. }

二叉树的后序遍历 :

后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点

给定一个二叉树,返回他的后序遍历的序列。

后序遍历是值按照 左节点->右节点->根节点 的顺序的遍历。

数据范围:二叉树的节点数量满足 1≤n≤100  ,二叉树节点的值满足1≤val≤100  ,树的各节点的值各不相同

1. 输入:
2. {1,#,2,3}
3. 返回值:
4. [3,2,1]

一、解题思路:递归

1. import java.util.*;
2. public class Solution {
3. public void postorder(List<Integer> list, TreeNode root){
4. //遇到空节点则返回
5. if(root == null) 
6. return;
7. //先去左子树
8.         postorder(list, root.left); 
9. //再去右子树
10.         postorder(list, root.right); 
11. //最后访问根节点
12.         list.add(root.val); 
13.     }
14. 
15. public int[] postorderTraversal (TreeNode root) {
16. //添加遍历结果的数组
17.         List<Integer> list = new ArrayList(); 
18. //递归后序遍历
19.         postorder(list, root); 
20. //返回的结果
21. int[] res = new int[list.size()]; 
22. for(int i = 0; i < list.size(); i++)
23.             res[i] = list.get(i);
24. return res;
25.     }
26. }

 二、解题思路:迭代

1. import java.util.*;
2. public class Solution {
3. public int[] postorderTraversal (TreeNode root) {
4. //添加遍历结果的数组
5.         List<Integer> list = new ArrayList(); 
6.         Stack<TreeNode> s = new Stack<TreeNode>();
7. TreeNode pre = null;
8. while(root != null || !s.isEmpty()){ 
9. //每次先找到最左边的节点
10. while(root != null){ 
11.                 s.push(root);
12.                 root = root.left;
13.             }
14. //弹出栈顶
15. TreeNode node = s.pop(); 
16. //如果该元素的右边没有或是已经访问过
17. if(node.right == null || node.right == pre){ 
18. //访问中间的节点
19.                 list.add(node.val); 
20. //且记录为访问过了
21.                 pre = node; 
22.             }else{
23. //该节点入栈
24.                 s.push(node); 
25. //先访问右边
26.                 root = node.right; 
27.             }
28.         }
29. //返回的结果
30. int[] res = new int[list.size()]; 
31. for(int i = 0; i < list.size(); i++)
32.             res[i] = list.get(i);
33. return res;
34.     }
35. }



相关文章
|
6月前
二叉树的前序遍历、中序遍历、后序遍历
二叉树的前序遍历、中序遍历、后序遍历
|
6月前
|
存储
什么?二叉树的反前序遍历?
什么?二叉树的反前序遍历?
|
6月前
|
算法
二叉树中序遍历(一)
二叉树中序遍历(一)
|
6月前
二叉树的中序遍历
二叉树的中序遍历
46 0
|
6月前
|
C++
二叉树的前序遍历(C++)
二叉树的前序遍历(C++)
49 0
二叉树的前序遍历(C++)
|
6月前
|
C++
二叉树的后序遍历(C++)
二叉树的后序遍历(C++)
43 0
|
6月前
二叉树的前、中、后序遍历的实现
二叉树的前、中、后序遍历的实现