3-31:还原二叉树

问题:还原二叉树

(1)根据一个二叉树的前序遍历和中序遍历还原二叉树。
(2)根据一个二叉树的后序遍历和中序遍历还原二叉树。


#include<iostream>
#include<list>
using namespace std;
typedef list<int>::iterator index;
class TreeNode
{
public:
    TreeNode(int value, TreeNode* left = NULL, TreeNode * right = NULL)
        :ivalue(value), ileft(left), iright(right)
    {

    }
    int getvalue()
    {
        return ivalue;
    }
    TreeNode* getleft()
    {
        return ileft;
    }
    TreeNode* getright()
    {
        return iright;
    }
    void setleft(TreeNode* left)
    {
        ileft = left;
    }
    void setright(TreeNode* right)
    {
        iright = right;
    }
private:
    int ivalue;
    TreeNode* ileft;
    TreeNode* iright;
};
void fronttraversal(list<int> &frontsequence,TreeNode* root)
{
    if (root)
    {
        frontsequence.push_back(root->getvalue());
        fronttraversal(frontsequence,root->getleft());
        fronttraversal(frontsequence,root->getright());
    }   
}
void middletraversal(list<int> &frontsequence, TreeNode* root)
{
    if (root)
    {
        middletraversal(frontsequence, root->getleft());
        frontsequence.push_back(root->getvalue());
        middletraversal(frontsequence, root->getright());
    }
}
TreeNode* reconstruct(index frontstart, index frontend, index middlestart, index middleend)
{
    TreeNode* root = new TreeNode(*frontstart);
    if (frontstart == frontend && *frontend == *frontstart)
        return root;
    index rootposition= middlestart;
    int leftlength = 0;
    index newfrontstart = frontstart;
    while (rootposition != middleend && *rootposition != root->getvalue())
    {
        leftlength++;
        newfrontstart++;
        rootposition++;
    }
    if (*rootposition == root->getvalue())
    {
        if (leftlength > 0)
        {
            root->setleft(reconstruct(++frontstart, add(frontstart,leftlength), middlestart, --rootposition));
            rootposition++;
        }
        if (rootposition != middleend)
        {
            root->setright(reconstruct(++add(frontstart,leftlength), frontend, ++rootposition, middleend));
        }
    }

}
int main()
{
    TreeNode* node7 = constructatree();

    list<int> frontsequence = list<int>();
    fronttraversal(frontsequence, node7);
    list<int> middlesequence = list<int>();
    middletraversal(middlesequence, node7);

    TreeNode* node1 = reconstruct(frontsequence.begin(), --frontsequence.end(), middlesequence.begin(), --middlesequence.end());

}
避免返回handles指向对象内部的成分

突然想到effective C++中提到过避免返回handles指向对象内部的成分,在上面的代码中尽管iright和ileft是私有成员,但是通过getleft和getright返回的reference却能够用来更改他们,所以这两个数据成员实际上是public,是时候加上const了。

const int getvalue() const
const TreeNode* getleft() const
const TreeNode* getright() const
void fronttraversal(list<int> &frontsequence,const TreeNode* root)
void middletraversal(list<int> &frontsequence, const TreeNode* root)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值