【注释详细,思路清晰】【打卡第2天】leetcode热题HOT100之Java实现:94、二叉树的中序遍历(使用栈)

1、题目描述

  二叉树的中序遍历(使用栈)

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

示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]

2、算法分析

   ①  二叉树的中序遍历,使用栈辨别二叉树的结点和集合List存储二叉树中结点的值

   ②  当栈不空,因为初始栈都是空的,说明栈中是存储元素的;当前结点不为空的时候遍历

   ③  当当前结点不为空的时候,遍历其左孩子,然后入栈

   ④  当当前结点为空的时候,从栈中出栈元素,继续遍历右孩子

3、代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */

/*
    二叉树的中序遍历
    给定一个二叉树的根节点root,返回中序遍历
    
    栈存储结点
    集合存储的是结点中的元素
    
*/
import java.util.*;

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        
        // 定义一个集合存储树中的结点的值,注意返回的是List
        List<Integer> list = new ArrayList<Integer>();
        
        // 定义一个栈结构,存储的是树中结点
        Stack<TreeNode> stack = new Stack<TreeNode>();
        
        // 定义当前元素
        TreeNode currentNode = root;
        
        // 当栈不空,或者是根节点不空的时候,符合条件
        // 因为初始栈都为空,存储元素后都需要遍历出来,所以判断栈不空
        while(currentNode != null || !stack.isEmpty()){
            
            // 当前元素不为空的时候
            if(currentNode != null){
                
                // 将当前元素进栈
                stack.push(currentNode);
                
                // 当前元素左孩子
                currentNode = currentNode.left;
            }  else{
                
                // 当前元素为空的时候,栈内出栈元素
                currentNode = stack.pop();
                
                // 将当前元素添加到集合中
                list.add(currentNode.val);
                
                // 判断出栈元素的右孩子
                currentNode = currentNode.right;
            }
        }
        return list;
    }
}

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/115257528
今日推荐