欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 【CT】LeetCode手撕—94. 二叉树的中序遍历

【CT】LeetCode手撕—94. 二叉树的中序遍历

2024/10/24 7:23:47 来源:https://blog.csdn.net/weixin_44382896/article/details/140121108  浏览:    关键词:【CT】LeetCode手撕—94. 二叉树的中序遍历

目录

  • 题目
  • 1- 思路
    • 1-1 递归
    • 1-2 迭代(访问节点+处理结点)
  • 2- 实现
    • ⭐94. 二叉树的中序遍历——题解思路
      • ①递归
      • ②迭代
  • 3- ACM 实现


题目

  • 原题连接:94. 二叉树的中序遍历

1- 思路

1-1 递归

思路1:使用递归的方式中序遍历

1-2 迭代(访问节点+处理结点)

  • 思路2:使用迭代法,借助栈来实现
  • 由于是中序遍历,所以第一步是 访问元素、第二部是处理元素

中序中的访问元素顺序

  • 由于是中序,所以从根节点开始访问之后,第一个处理的元素应该是左子树的最左下角的元素。
  • 中序中遇到的问题是:访问顺序和处理顺序不一样。

思想 ——> 利用栈,入栈采用 右 中 左的顺序,此时弹出就是 左 中 右
image.png

  • 1.对于指针遍历的顺序,首先先遍历 根节点5 ——> 4 ——> 1,利用 **栈 **记录遍历的顺序
    1. 访问到 1 的左叶子结点,发现 1的左孩子 null 了,此时从栈取元素,弹出 1
    1. 访问道 1 的右叶子结点,发现 1的右孩子 null 了,此时从栈取元素,弹出 4
    1. 访问 4 的右孩子,此时 4 的右孩子不为 null ,此时 入栈 2

2- 实现

⭐94. 二叉树的中序遍历——题解思路

①递归

在这里插入图片描述

class Solution {List<Integer> res = new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {// 递归 终止条件if(root==null){return res;}// 递归逻辑inorderTraversal(root.left);res.add(root.val);inorderTraversal(root.right);return res;}
}

②迭代

在这里插入图片描述

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null){return result;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()){if (cur != null){stack.push(cur);cur = cur.left;}else{cur = stack.pop();result.add(cur.val);cur = cur.right;}}return result;}
}

3- ACM 实现

public class inOrder {static class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(){}TreeNode(int x){val = x;}}public static TreeNode build(Integer[] nums){//借助 队列实现TreeNode root = new TreeNode(nums[0]);Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int index = 1;while(!queue.isEmpty()){TreeNode newNode = queue.poll();if(index<nums.length && nums[index]!=null){root.left = new TreeNode(nums[index]);queue.offer(root.left);}index++;if(index<nums.length && nums[index]!=null){root.right = new TreeNode(nums[index]);queue.offer(root.right);}index++;}return root;}// 中序static List<Integer> res = new ArrayList<>();public static List<Integer> inOrderT(TreeNode root){// 判空if(root==null){return res;}TreeNode cur = root;Stack<TreeNode> st = new Stack<>();while(cur!=null || !st.isEmpty()){if(cur!=null){st.push(cur);cur = cur.left;}else{cur = st.pop();res.add(cur.val);cur = cur.right;}}return res;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("输入二叉树构造序列");String input = sc.next();input = input.replace("[","");input = input.replace("]","");String[] part = input.split(",");Integer[] nums = new Integer[part.length];for(int i = 0 ; i < part.length;i++){if(!part[i].equals("null")){nums[i] = Integer.parseInt(part[i]);}else{nums[i] = null;}}TreeNode root = build(nums);List<Integer> forRes = inOrderT(root);System.out.println(forRes.toString());}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com