二叉树
代码随想录二叉树专题,开刷!
先中后序遍历的递归和迭代实现。
递归实现三种遍历代码大致相同,只需要将遍历左中右结点的代码换一下位置即可。
先序:
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、 数据结构(严蔚敏)

浙公网安备 33010602011771号