栈:中序遍历

本文介绍了如何利用栈来实现二叉树的中序遍历。首先通过递归方式解释了中序遍历的基本步骤,即当根节点不空时,先遍历左子树,然后将根节点值加入结果,最后遍历右子树。接着详细说明了栈结构的实现过程,包括定义栈、当遍历节点或栈不空时进行循环,将左节点入栈,弹栈记录节点值,以及访问当前节点的右节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出一棵二叉树,返回这棵树的中序遍历

//递归,o(n)t(n)

解题思路:

1.根节点不空时,

2.左子树不空,遍历左子树

3.根节点值加入到结果中

4.右子树不空,遍历右子树

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
public class Solution {
    /**
     *
     * @param root TreeNode类
     * @return int整型ArrayList
     */
    public ArrayList<Integer> inorderTraversal (TreeNode root) {
        ArrayList<Integer>list=new ArrayList<>();
        helper(root,list);
        return list;
    }
    public void helper (TreeNode root,ArrayList<Integer> list){
          if(root!=null){
              if(root.left!=null){
                  helper(root.left,list);
              }
              list.add(root.val);
              if(root.right!=null){
                  helper(root.right,list);
              }
          }
   
    }
}

1.定义栈结构

2.当栈不空或者是遍历节点不为空时,循环

3.当遍历节点不空时,找到左节点,将其依次入栈,

4.弹栈(最左节点),将其节点值记录在list中

5.访问当前节点右节点

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
public class Solution {
    /**
     *
     * @param root TreeNode类
     * @return int整型ArrayList
     */
    public ArrayList<Integer> inorderTraversal (TreeNode root) { 
        ArrayList<Integer>list=new ArrayList<>();
        Stack<TreeNode> stack=new Stack<>();
        TreeNode cur=root;
        while(cur!=null||!stack.isEmpty()){
            while(cur!=null){
                stack.push(cur);
                cur=cur.left;
            }
            //弹出的是最左下节点
            cur=stack.pop();
            list.add(cur.val);
            cur=cur.right;
        }
        return list;
    }
}

 

序遍历是一种二叉树的遍历方法,按照“左子树 -> 根节点 -> 右子树”的顺序访问每个节点。我们可以利用来模拟递归的过程,从而实现非递归版本的中序遍历。 以下是使用实现序遍历的具体步骤: 1. 初始化一个空,并将当前指针指向根节点。 2. 当当前节点不为空或不为空时循环执行以下操作: - 如果当前节点存在,则将其压入并移动到其左子节点。 - 若无左子节点,则从顶弹出元素作为当前节点,并打印该节点值。 - 移动至右子节点继续上述过程直至完成所有节点的遍历。 通过这种方式可以避免显式的函数调用开销,在某些场景下效率更高。 下面是一个简单的Python示例代码展示如何基于来进行迭代式中序遍历: ```python class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None def inorderTraversal(root): stack, result = [], [] current_node = root while stack or current_node: if current_node is not None: # 将节点不断加入堆直到到达最左边 stack.append(current_node) current_node = current_node.left else: # 访问最近一次未处理完的部分 node = stack.pop() result.append(node.val) current_node = node.right return result ``` 此算法的时间复杂度为O(n),其中n代表树中的结点数;空间上需要额外的空间存储最多达高度h层深的结点,因此平均情况下的空间复杂度也是 O(h), 最差情形(极度不平衡之树)则会达到线性阶即 O(n) 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值