[每日一题][剑指offer]重建二叉树:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字

描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

来源:力扣(LeetCode)
 

代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || preorder.length == 0) {
            return null;
        }
        //获取前序遍历的第一个元素,这就是根节点
        TreeNode root = new TreeNode(preorder[0]);
        int length = preorder.length;
        Stack stack = new Stack();
        //把根节点存入栈
        stack.push(root);
        int inorderIndex = 0;
        //已经获取到了第一个元素 所以从下标1开始循环
        for (int i = 1; i < length; i++) {
            //获取每一个元素
            int preorderVal = preorder[i];
            //得到栈的最后一个元素
            TreeNode node = stack.peek();
            //第一次循环 得到的中序遍历的第一个数 和 第一个进栈的数 不相等 那么他就是 这个根节点的左子树的数
            if (node.val != inorder[inorderIndex]) {
                //前序第一个数和中序第一个数不相等 那么 将前序第二个数 放进左侧 并且将此数 放进栈
                node.left = new TreeNode(preorderVal);
                stack.push(node.left);
            } else {
                while (!stack.isEmpty() && stack.peek().val == inorder[inorderIndex]) {
                    
                    node = stack.pop();
                    inorderIndex++;
                }
                node.right = new TreeNode(preorderVal);
                stack.push(node.right);
            }
        }
        return root;

    }
}

性能:

[每日一题][剑指offer]重建二叉树:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字_第1张图片

这道题目前就是看懂了,还没有做一些深入的学习。后续会更新。

你可能感兴趣的:(每日一题,二叉树,stack,算法,数据结构,leetcode)