LeetCode经典算法题 no.94 二叉数的中序遍历

题目: 二叉数的中序遍历

题目描述:

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

实例展示:

情形一:
输入:root = [1,null,2,3]
输出:[1,3,2]

情形二:
输入:root = []
输出:[]

情形三:
输入:root = [1]
输出:[1]

基础知识回顾:

树 :具有父子关系的一种结构

节点:数中的没一个元素

根节点:最上面的那一个

叶子节点:没有孩子的节

高度:从底层向上算

深度:从顶层向下计算

层:从根节点向下计算,根节点所在的是第一层

LeetCode经典算法题 no.94 二叉数的中序遍历_第1张图片

二叉树:

普通二叉树:每个节点最多只能有两个孩子

满二叉树:除叶子节点,每个结点都有两个孩子

完全二叉树:从根节点开始,从上到下从左到右,依次填满节点形成的二叉树

LeetCode经典算法题 no.94 二叉数的中序遍历_第2张图片

 二叉树的遍历:

序遍历:节点 -> 左子树 -> 右子树

序遍历:左子树 -> 节点 -> 右子树

序遍历:左子树 -> 右子树 -> 节点

LeetCode经典算法题 no.94 二叉数的中序遍历_第3张图片

该题思路分析:

1)返回的结果是一个List列表,控制列表元素的有序输出需借助栈,因为我们需要手动new一个栈出来,因此这次采用的就是迭代方式。

2)大致操作步骤:先让父节点入栈,依次遍历其左孩子,当一侧左孩子获取完时, 再依次出栈,只有当该父节点的所有左孩子都出栈完毕时,父节点才可出栈。随后取其右孩子的值,当检索到最后一个右孩子节点时,再依次出栈。

代码中的一些说明:

1)TreeNode:经常用到的一个结构体,表示数据结构树中的一个节点

2)栈的常用操作:

      empty():测试是否为空

      peek():查看此栈栈顶部的对象

      pop():删除此栈栈顶部的对象,并将该对象作为函数的返回值 (出栈)

      push():入栈

      search():返回一个对象在此栈上的位置

代码展示:

/**
 * 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;
 *     }
 * }
 */
class Solution {
    public List inorderTraversal(TreeNode root) {
        List list = new ArrayList<>();
        Stack stack = new Stack<>();
        while(root != null || !stack.isEmpty()){
            while(root != null){
                //根节点最先入栈
                stack.push(root);
                //依次取其左孩子部分
                root = root.left;
            }
            //左侧已全部取完,依次出栈
            root = stack.pop();
            //将出栈元素值存入到list中
            list.add(root.val);
            //取其右孩子部分
            root = root.right;     
        }
        return list;
    }
}

你可能感兴趣的:(LeetCode经典算法题,java,算法)