leetcode

    xiaoxiao2021-03-25  85

    题意:

    给出一个二叉树的中序遍历和后序遍历的结果,还原构造出这颗树。

    分析:

    首先我们应该搞清楚中序遍历和后序遍历的原理。

    其次,我们应该举个例子,用人脑的思维方式,来完成这个过程。再根据人脑的思维过程来思考怎么控制计算机来完成。

    比如:

                                        1

                               2                3

                        4           5      6         7

    后序:452 673 1

    中序:425 1 673

    对于后序数组,我们发现,根节点一定在数组的最后一个,左右子树的根节点也在对应的子数组的最后一个。

    对于中序数组,我们发现,根节点在中间某个位置,但是可以确定的是,左子树的结点都在根节点的左边,右子树的结点根节点都在右边

    所以,我们可以倒序遍历后序数组,将第一个数来构造根节点。

    将根节点的左结点设置为递归的结果,将根节点的右结点也设置为递归的结果。

    递归的参数变化可以用角标来限定子数组区间。

    同时我们可以利用根节点的值在中序数组中找到这个数。

    /**  * Definition for a binary tree node.  * public class TreeNode {  *     int val;  *     TreeNode left;  *     TreeNode right;  *     TreeNode(int x) { val = x; }  * }  */ public class Solution {     public TreeNode buildTree(int[] inorder, int[] postorder) {         if(inorder.length==0 || postorder==null)             return null;         return helper(inorder, postorder, postorder.length-1, 0, inorder.length-1);     }          private TreeNode helper(int[] inorder, int[] postorder, int rootindex, int start, int end){         if(start > end){             return null;         }         int rootval = postorder[rootindex];         TreeNode root = new TreeNode(rootval);         int index = findRootInInorder(rootval, inorder, start, end);         int leftsize = end- index;         root.left = helper(inorder, postorder, rootindex-1-leftsize, start, index-1);         root.right = helper(inorder, postorder, rootindex-1, index+1, end);         return root;     }          private int findRootInInorder(int rootval, int[] inorder, int start, int end){         for(int i=start; i<=end; i++){             if(inorder[i] == rootval){                 return i;             }         }         return -1;     } }

    转载请注明原文地址: https://ju.6miu.com/read-15388.html

    最新回复(0)