根据前序和中序重建二叉树

注意:1、仅根据前序和后序无法构建唯一的二叉树;2、二叉树前序遍历,第一个数字总是树的根节点的值;3、中序遍历中,根节点的值在序列的中间,左子树的值子在根节点的值的左边,右字树的值在根节点的值的右边;4、思路:递归

#include <iostream>
#include <stdlib.h>
using namespace std;
struct Node{
    int value;
    Node* left;
    Node* right;
};

Node* ConstructCore(int *startPreorder,int *endPreorder,int *startInorder,int *endInorder){
    Node* root=new Node();
    root->value=startPreorder[0];
    root->left=root->right=NULL;

    //如果仅有一个节点
    if(startPreorder == endPreorder){
        if(startInorder == endInorder && *startPreorder == *startInorder){
            return root;
        }
        else{
            cout<<"Invalid input"<<endl;
            exit(1);
        }
    }

    //在中序遍历中找到根节点的值
    int *rootInorder=startInorder;
    while( rootInorder<=endInorder && *rootInorder!=root->value){
        rootInorder++;
    }

    if(rootInorder == endInorder && *rootInorder != root->value){
        cout<<"Invalid input"<<endl;
        exit(1);
    }

    int leftLength=rootInorder-startInorder;
    int *leftPreorderEnd=startPreorder+leftLength;

    //递归调用,构建
    if(leftLength>0){
        root->left=ConstructCore(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);
    }

    if(leftLength < endPreorder - startPreorder){
        root->right=ConstructCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);
    }

    return root;
}
//构建函数
Node* Construct(int *preorder,int * inorder,int length){
    if( preorder == NULL || inorder == NULL || length<=0){
        return NULL;
    }
    return ConstructCore(preorder,preorder+length-1,inorder,inorder+length-1);
}
void pre_order(Node* root){
    if(root != NULL){
        cout<<root->value<<" ";
        pre_order(root->left);
        pre_order(root->right);
    }
}

void in_order(Node* root){
    if(root != NULL){
        in_order(root->left);
        cout<<root->value<<" ";
        in_order(root->right);
    }
}

void post_order(Node* root){
    if(root != NULL){
        post_order(root->left);
        post_order(root->right);
        cout<<root->value<<" ";
    }
}

int main(){
    int length=8;
    int preorder[]={1,2,4,7,3,5,6,8};
    int inorder[]={4,7,2,1,5,3,8,6};
    Node* treeRoot=Construct(preorder,inorder,length);
    cout<<"Test pre_order"<<endl;
    pre_order(treeRoot);
    cout<<endl<<"Test in_order"<<endl;
    in_order(treeRoot);
    cout<<endl<<"Test post_order"<<endl;
    post_order(treeRoot);
}
/*
Test pre_order
1 2 4 7 3 5 6 8
Test in_order
4 7 2 1 5 3 8 6
Test post_order
7 4 2 5 8 6 3 1
Process returned 0 (0x0)   execution time : 0.259 s
Press any key to continue.
*/

根据前序和中序重建二叉树,布布扣,bubuko.com

时间: 2024-12-26 06:19:47

根据前序和中序重建二叉树的相关文章

根据前序和中序列 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列.

依据前序和中序列 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字.比如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}.则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包括多个測试例子.对于每一个測试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包含n个整数(当中每一个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列

前序和中序构造二叉树

题目链接: 涉及知识:二叉树的遍历 分析: 二叉树的前序遍历:根节点 -> 左子树 -> 右子树 二叉树的中序遍历:左子树 -> 根节点 -> 右子树 由此可知:前序遍历中访问到的第一个元素便是根节点,通过该点便可以将中序遍历分成左右两部分,左部分的元素用来生成该二叉树的左子树,右部分用来生成二叉树的右子树. 同样,左右两部分的元素中,首先在前序遍历中出现的便是该子树的根节点,很明显符合递归的定义. 代码如下: /* * @lc app=leetcode.cn id=105 lan

题目:1385 由前序和中序构建二叉树

http://ac.jobdu.com/problem.php?pid=1385 蛮怀旧的题目,记得大一就见过一直没做过,没难度,纯小心吧. 类似的是有中序和后续构建二叉树.比如http://www.cnblogs.com/kaituorensheng/p/3788533.html 思路很简单 递归构造: #include <cstdio> #include <cstring> #include <iostream> #include <cstdio> #i

由先序和中序重建二叉树

思路: 我们知道,前序遍历的第一个节点就是树的根节点,所以我们先根据前序遍历序列的第一个数字创建根结点,接下来在中序遍历序列中找到根结点的位置,根节点的左边就是左子树,右边就是右子树,这样就能确定左.右子树结点的数量.在前序遍历和中序遍历的序列中划分了左.右子树结点的值之后,就可以递归地去分别构建它的左右子树. /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode

C++根据前序和中序构造二叉树

#include <iostream> #include <string.h> using namespace std; template<typename Type> struct Node { Type data; Node<Type> *left; Node<Type> *right; Node(Type d = Type()):data(d),left(NULL),right(NULL){} }; template<typename

construct-binary-tree-from-preorder-and-inorder-traversal——前序和中序求二叉树

Given preorder and inorder traversal of a tree, construct the binary tree. Note:  You may assume that duplicates do not exist in the tree. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right

Leetcode:Construct Binary Tree 前序和中序、后序和中序构建二叉树

前序和中序构建二叉树 后序和中序构建二叉树 分析:主要思路就是 在中序中找根节点然后划分左右子树,具体如下: 1. 查找根节点. 我们知道前序序列的第一个元素 和 后序序列的最后一个元素 肯定是根节点,我们就以此为突破口 2. 确定根节点的坐标. 我们在 中序序列中找到 根节点 的下标. 3. 分割左右子树. 对于中序序列:根节点下标之前的都属于左子树,之后的都属于右子树 对于先序序列:根节点之后的 一段元素(该段长度可以由中序序列的左子树长度确定)属于左子树,左子树之后的元素属于右子树 对于先

【基础备忘】 二叉树前序、中序、后序遍历相互求法

转自:http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html 今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性: 前序遍历:     1.访问根节点     2.前序遍历左子树     3.前序遍历右子树 中序遍历:     1.中序遍历左子树     2