二叉树 根据后序遍历生成二叉树

题目:给定一个二叉树的后序遍历数组arr[],生成二叉树

解题思路:根据搜索二叉树的性质,数组的最后一位arr[end]是二叉树的根,而且数组的左部分比arr[end]小,是根节点的左子数,数字的右部分比arr[end]大,是数组的右子数。

Example:

树的形状如上图,后序遍历为:1 3 2 6  8 7 5

arr[end] = 5;

左部分(左子树):{1,3,2}

右部分(右子树):{6,8,7}

package cn.edu.algorithm.prototype;

/**
 * 根据后序遍历构造二叉树
 */
public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 3, 2, 6, 8, 7, 5};
        TreeNode root = postToBST(arr, 0, arr.length - 1);
        inOrder(root);
    }
    public static void inOrder(TreeNode node) {

        if (node != null) {
            inOrder(node.left);
            System.out.println(node.value);
            inOrder(node.right);
        }
    }
    public static TreeNode postToBST(int[] arr, int start, int end) {
        if (start > end)
            return null;
        TreeNode node = new TreeNode(arr[end]);
        int less = -1;
        int more = end;
        for (int i = start; i < end; i++) {
            if (arr[end] > arr[i]) {
                less = i;
            } else {
                more = more == end ? i : more;
            }
        }
        node.left = postToBST(arr, start, less);
        node.right = postToBST(arr, more, end - 1);
        return node;
    }
}
class TreeNode {
    protected int value;
    protected TreeNode left;
    protected TreeNode right;

    public TreeNode(int value) {
        this.value = value;
    }
}
时间: 2024-10-04 09:27:39

二叉树 根据后序遍历生成二叉树的相关文章

二叉树的后序遍历(暴力版) 小白菜oj 1034

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历-- 作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法--但只是估计-- 下面讲述我的超暴力解法-- 首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可. 但这个方法有两个比较--&¥--&的问题:1

Construct Binary Tree from Inorder and Postorder Traversal ——通过中序、后序遍历得到二叉树

题意:根据二叉树的中序遍历和后序遍历恢复二叉树. 解题思路:看到树首先想到要用递归来解题.以这道题为例:如果一颗二叉树为{1,2,3,4,5,6,7},则中序遍历为{4,2,5,1,6,3,7},后序遍历为{4,5,2,6,7,3,1},我们可以反推回去.由于后序遍历的最后一个节点就是树的根.也就是root=1,然后我们在中序遍历中搜索1,可以看到中序遍历的第四个数是1,也就是root.根据中序遍历的定义,1左边的数{4,2,5}就是左子树的中序遍历,1右边的数{6,3,7}就是右子树的中序遍历

[二叉树建树]1119. Pre- and Post-order Traversals (30) (前序和后序遍历建立二叉树)

1119. Pre- and Post-order Traversals (30) Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences, or preorder and inorder traversa

先序遍历和后序遍历构建二叉树

递归的方法利用先序遍历和中序遍历构建二叉树,同样也可以利用到中序遍历和后序遍历构建二叉树. //利用先序遍历和中序遍历构建二叉树 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { TreeNode *root=NULL; if(preorder.size()==0||inorder.size()==0||preorder.size()!=inorder.size()) return

判断序列是否是二叉树的后序遍历序列

这个题的意思就是给定一个序列,判断这个序列是否是某个二叉排序树的后序遍历序列,这个算法的方法主要是根据后序遍历的性质,首先这个序列的最后一个元素肯定是根元素,然后将序列从左往右遍历,找到第一个大于根元素的点,这个点左边的肯定是当前根的左子树,这个点的右边肯定是当前根的右子树,继续向后遍历,看右子树中是否有值小于根,如果有,则false,否则分左右子树分别再次调用函数进行判断.具体代码如下: 1 public class IsLastOrder{ 2 3 public boolean islast

Binary Tree Postorder Traversal 二叉树的后序遍历

地址:https://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 题意就是完成二叉树的后序遍历,我们知道如果使用递归进行二叉树后序遍历将是非常简单的事情. public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer > ans = new ArrayList<>(); Tr

leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)

题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 说明: 1) 两种实现,递归与非递归 , 其中非递归有两种方法 2)复杂度分析:时

[LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历

Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 经典题目,求二叉树的后序遍历的非递归方法,跟前序,中序,层序一样都需要用到栈,后续的顺序

中序遍历 后序遍历 恢复二叉树

中序遍历:dbeafc 后序遍历:debfca #include <stdio.h> #include <stdlib.h> #include <string.h> void RestoreTree(char *in,char *post,int len ,int treeLen,char* out, int index) { if(index>=treeLen) return; out[index] = post[len-1]; int i = 0; for(;