二叉树

代码随想录二叉树专题,开刷!

先中后序遍历的递归和迭代实现。

递归实现三种遍历代码大致相同,只需要将遍历左中右结点的代码换一下位置即可。

先序:

 1 class Solution {
 2     public List<Integer> preorderTraversal(TreeNode root) {
 3         List<Integer> res = new ArrayList<>();
 4         preOrder(root, res);
 5         return res;
 6     }
 7 
 8     public void preOrder(TreeNode root, List<Integer> res) {
 9         if (root == null) {
10             return;
11         }
12         res.add(root.val);
13         preOrder(root.left, res);
14         preOrder(root.right, res);
15     }
16 }

迭代实现就是定义一个栈来模拟递归过程。

先序:

 1 class Solution {
 2     public List<Integer> preorderTraversal(TreeNode root) {
 3         List<Integer> res = new ArrayList<>();
 4         Deque<TreeNode> stack = new LinkedList<>();
 5         stack.push(root);
 6         while (!stack.isEmpty()) {
 7             TreeNode cur = stack.pop();
 8             if (cur != null) {
 9                 //遍历中结点,值放入结果集
10                 res.add(cur.val);
11                 //先放入右结点,再放入左结点,出栈就是先左后右
12                 stack.push(cur.right);
13                 stack.push(cur.left);
14             }
15         }
16         return res;
17     }
18 }

后序,按先序遍历的来写,结点入栈时先入右结点,再入左结点,得到的结果集就是中右左,然后reverse一下,就是我们需要的左右中遍历结果了。

 1 class Solution {
 2     public List<Integer> postorderTraversal(TreeNode root) {
 3         List<Integer> res = new ArrayList<>();
 4         Deque<TreeNode> stack = new LinkedList<>();
 5         stack.push(root);
 6         while (!stack.isEmpty()) {
 7             TreeNode cur = stack.pop();
 8             if (cur != null) {
 9                 res.add(cur.val);
10                 stack.push(cur.left);
11                 stack.push(cur.right);
12             }
13         }
14         Collections.reverse(res);
15         return res;
16     }
17 }

中序遍历结点和处理结点不能同时进行,此时不需要专门定义一个指针保存根节点,左子树遍历完或左子树为空时,遍历根节点(根节点出栈),将右子树根节点压入栈中继续遍历。

 1 class Solution {
 2     public List<Integer> inorderTraversal(TreeNode root) {
 3         List<Integer> res = new ArrayList<>();
 4         Deque<TreeNode> stack = new LinkedList<>();
 5         stack.push(root);
 6         while (!stack.isEmpty()) {
 7             TreeNode cur = stack.peek();
 8             //遍历左子树
 9             //所有左子节点入栈,并找到当前结点的最左子节点
10             while (!stack.isEmpty() && cur != null) {
11                     stack.push(cur.left);
12                     cur = cur.left;
13             }
14             //空指针退栈
15             stack.pop();
16             //遍历, 有左结点就遍历左子节点,无左结点即null则在上一步退栈,此时遍历的是当前节点。
17             if (!stack.isEmpty()) {
18                 cur = stack.pop();
19                 res.add(cur.val);
20                 stack.push(cur.right);
21             }
22         }
23         return res;
24     }
25 }

简单题好像对我来说也不是很简单。

参考:代码随想录:programmercarl.com、 数据结构(严蔚敏)

 

posted @ 2022-03-26 16:07  一梦两三年13  阅读(37)  评论(0)    收藏  举报