zoukankan      html  css  js  c++  java
  • 重建二叉树

    题目:根据先序遍历和中序遍历重新还原出二叉树

    思路:

    1.找到先序第一个数字并赋值给根节点root->data;

    2.在中序序列中找到先序的第一个数字;

    3.中序左边的序列为根节点root的左子树(左递归),右边的序列为root的右子树(右递归)。

    代码如下:

    #include<iostream>
    using namespace std;
    struct Treenode
    {
        int data;
        Treenode *lchild;
        Treenode *rchild;
    };
    //重建二叉树:递归构建
    Treenode *build(int *first,int *second,int length)
    {
        //判断参数是否合法
        if(first==NULL||second==NULL||length<=0)
            return NULL;
        int rootvalue=first[0];
        Treenode *root=new Treenode();
        root->data=rootvalue;
        root->lchild=root->rchild=NULL;
        //只有一个结点时返回
        if(length==1)
        {
            if(first[0]==second[0])
                return root;
            else
                throw exception("input error!");//抛出异常,C#中是throw new exception();
        }
        //多个结点时候递归
        else
        {
            int i=0;
            //在中序遍历中找到root结点
            while(i<length&&second[i]!=rootvalue)
                i++;
            if(i==length)
                throw exception("input error!!");
            //递归左子树,i左边的序列
            if(i>0)
            {
                root->lchild=build(first+1,second,i);
            }
            //递归右子树,i右边的序列
            if(i<length-1)
            {
                root->rchild=build(first+i+1,second+i+1,length-i-1);
            }
        }
        return root;
    }
    //按照中序打印二叉树
    void print(Treenode *root)
    {
        if(root)
        {
            print(root->lchild);
            cout<<root->data<<endl;
            print(root->rchild);
        }
    }
    int main()
    {
        try
        {
            int a[10]={1,2,4,7,3,5,6,8};
            int b[10]={4,7,2,1,5,3,8,7};
            Treenode *root=build(a,b,8);
            print(root);
        }
        catch(const exception &e)
        {
            cerr<<e.what()<<endl;//cerr用来输出异常
        }
    }

    测试结果:

  • 相关阅读:
    5个排序算法
    原生侧边栏sidebar
    静态方法、实例方法、继承
    函数作用域之闭包与this!
    OOP面向对象编程(下)
    数组方法篇二
    对象
    nginx windows负载均衡入门
    NVelocity
    python3简单爬虫
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4483042.html
Copyright © 2011-2022 走看看