题目:由前序、中序遍历序列重建二叉树

虽然思路能想到,但是实际写却无从下手。。。
下面重现作者代码,多多实践。。。

#include<exception>

//首先定义二叉树节点
struct BinaryTreeNode
{
int bt_Value;
BinaryTreeNode* bt_pLeft;
BinaryTreeNode* bt_pRight;
}; //核心函数:ConstructCore(int* StartPreOrder, int* EndPreOrder, int* StartInOrder, int* EndInOrder);
BinaryTreeNode* ConstructCore(int* StartPreOrder, int* EndPreOrder,
int* StartInOrder, int* EndInOrder)
//StartPreOrder,EndPreOrder为先序遍历序列的首尾;StartInOrder,EndInOrder为中序遍历序列的首尾
//总体思路:1、先序遍历首元素即为根节点,创建根节点;
// 2、中序遍历中寻找根节点,以此为界,前面为左子树,后面为右子树;
// 3、函数递归以创建左子树和右子树;
// 递归终止条件:StartPreOrder == EndPreOrder时,StartInOrder同时应等于EndInOrder,为叶子节点。 //因Construct函数中已验证了各个指针项的合法性,所以ConstructCore不再验证。
{
//根据前序序列首元素创建根节点
int RootValue = StartPreOrder[];
BinaryTreeNode* root = new BinaryTreeNode;
root->bt_Value = RootValue;
root->bt_pLeft = root->bt_pRight = NULL; //递归终止条件
if(StartPreOrder == EndPreOrder)
{
if(StartInOrder == EndInOrder && *StartPreOrder == *StartInOrder)
return root; //该节点为叶子节点,创建子树结束
else
throw std::exception("Invalid Input!");
} //在中序序列中寻找根节点位置
int* rootInOrder = StartInOrder;
while(rootInOrder <= EndInOrder && *rootInOrder != RootValue)
rootInOrder++;
if(rootInOrder > EndInOrder)
throw std::exception("Invalid Input!");
//确定左子树的节点个数
int LeftTreeLength = rootInOrder - StartInOrder;
int* LeftTreePreOrderEnd = StartPreOrder + LeftTreeLength;
//创建左子树
if(LeftTreeLength > )
root->bt_pLeft = ConstructCore(StartPreOrder+,LeftTreePreOrderEnd,StartInOrder,rootInOrder-);
//创建右子树
if(rootInOrder < EndInOrder)
root->bt_pRight = ConstructCore(LeftTreePreOrderEnd+,EndPreOrder,rootInOrder+,EndInOrder); return root;
} //调用该递归函数的Construct函数如下:
BinaryTreeNode* Construct(int* PreOrder, int* InOrder, int length)
{
if(PreOrder == NULL || InOrder == NULL || length <= )
return NULL;
return ConstructCore(PreOrder,PreOrder+length-,InOrder,InOrder+length-);
}
//BinaryTree.cpp中的各个接口实现
//1. 创建二叉树节点
BinaryTreeNode* CreateBinaryTreeNode(int value)
{
BinaryTreeNode* pNode = new BinaryTreeNode;
pNode->bt_Value = value;
pNode->bt_pLeft = pNode->bt_pRight = NULL; return pNode;
} //2. 连接树节点
void ConnectBinaryTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
{
if(pParent != NULL)
{
pParent->bt_pLeft = pLeft;
pParent->bt_pRight = pRight;
}
else
return;
} //3. 打印树节点及其孩子节点
void PrintTreeNode(BinaryTreeNode* pNode)
{
if(pNode != NULL)
{
cout<<"The value of this node is: "<<pNode->bt_Value
<<endl;
if(pNode->bt_pLeft != NULL)
cout<<"The value of the left-child node is: "<<pNode->bt_pLeft->bt_Value
<<endl;
else
cout<<"The left-child node is NULL!"<<endl;
if(pNode->bt_pRight != NULL)
cout<<"The value of the right-child node is: "<<pNode->bt_pRight->bt_Value
<<endl;
else
cout<<"The right-child node is NULL!"<<endl;
}
else
cout<<"This node is NULL!"<<endl;
} //4. 打印树 (逐三角打印)
void PrintTree(BinaryTreeNode* pRoot)
{
PrintTreeNode(pRoot); if(pRoot != NULL)
{
if(pRoot->bt_pLeft != NULL)
PrintTree(pRoot->bt_pLeft);
if(pRoot->bt_pRight != NULL)
PrintTree(pRoot->bt_pRight);
} } //5. 销毁树
void DestroyTree(BinaryTreeNode* pRoot)
{
if(pRoot != NULL)
{
BinaryTreeNode* pLeft = pRoot->bt_pLeft;
BinaryTreeNode* pRight = pRoot->bt_pRight; delete pRoot;
pRoot = NULL; DestroyTree(pLeft);
DestroyTree(pRight);
}
}

剑指offer--面试题6的更多相关文章

  1. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  2. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  3. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  4. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  5. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  6. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

  7. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  8. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  9. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  10. C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解

    剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...

随机推荐

  1. vSphere存储

    write by xiaoyang 配置iSCSI外部存储 1.      选择配置——硬件——存储 2.      在存储适配器里选择添加软件iSCSI适配器 3.      确认添加 4.     ...

  2. 另类安装系统——PE工具提取

    1. 在当前系统使用安装工具win$man打开,即pe里集成安装工具 2. 选择安装的磁盘或者分区和引导分区 3. 可以默认下一步 4. 不想更改盘符可以默认下一步 5. 最后完成开始安装部署(还需要 ...

  3. ASP.NET jquery ajax传递参数

    第一种:GET传递 前台 ajax   GET 传递 :即在请求的地址后面加上参数,URL地址长度有显示,安全性低 后台接收:Request.QueryString[“参数名字”]! 例如: func ...

  4. Application 统计在线人数

    MVC 统计在线人数: protected void Application_Start() { Application[; AreaRegistration.RegisterAllAreas(); ...

  5. OpenStack 加入新的节点,创建虚拟机失败的问题

    最开始做OpenStack的时候,由于只是为了部署测试用,因此将所有的部分都装在一台单网卡的机器上,费了九牛二虎之力终于部署成功,其中最主要的两块问题出现在以下两个方面: 1:nova.neutron ...

  6. 济南学习 Day 4 T1 am

    完美的序列(sequence)Time Limit:1000ms Memory Limit:64MB题目描述LYK 认为一个完美的序列要满足这样的条件:对于任意两个位置上的数都不相同.然而并不是所有的 ...

  7. KOBEV / KOBED

    check the highlighted. the number of execution. if too high, can be the requirement was all met. whi ...

  8. 【风马一族_Android】Android Studio 给APP设置签名

    在Android Studio中,给App签名,如果没有给App设置签名的话,Android Studio会主动给app设置一个默认的签名 接下来,介绍主动给App设置一个签名的整个步骤过程: 1) ...

  9. linux远程客户端putty,xshell搭建注意事项——《视频》

    本视频放在云端,点击此链接即可播放:              http://www.tudou.com/programs/view/75QMh0-DQfA/               崇尚开源,热 ...

  10. Cadence Allegro小技巧-从外部文本文件添加文本

    菜单“Add->Text”,然后在右侧Options栏设置好合适的Class and Subclass,Text block,然后在布板界面上点击鼠标左键,设置起始点,接着点击鼠标右键,在弹出的 ...