剑指offer--面试题6
题目:由前序、中序遍历序列重建二叉树
虽然思路能想到,但是实际写却无从下手。。。
下面重现作者代码,多多实践。。。
#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的更多相关文章
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
随机推荐
- 通过SQL ID查询SQL Text
SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS FROM V$SQLAREA where SQL_ID='22v8fyk0juw25';
- 《锋利的jQuery》心得笔记--One Sections
第一章 1. $是jQuery的一个简写形式 2. 在jQuery中无法使用DOM对象的任何方法:比如:$ (“#id”).innerHTML.$ (“#id”).checked, 可以使 ...
- JAVA设计模式(DESIGN PATTERNS IN JAVA)读书摘要 第1部分接口型模式——第4章 外观(Facade)模式
外观模式就类似于一个工具包,一个类对应一个功能. 外观模式的意图是为子系统提供一个接口,便于它的使用. 书中给出的例子是画一个哑弹的飞行路径, 初始的类的设计是这样的,看下图, ShowFlight类 ...
- Linux ThunderBird Exchange 过期
在Linux上只用Web版处理邮件,就是因为找不到太好的能支持Exchange的邮件客户端.在网上无意中发现了ExQuilla这个Thunderbird的插件,试用了一下还是不错的,很方便,不过只能免 ...
- visifire3.6.8 去水印方法
visifire 很NB的一套开源图表 不多介绍 详询google 3.0以下版本可以直接继承Chart类 override 加水印的函数就可以, 3.0以上版本需要自己编译源代码 这个水印函数藏得有 ...
- win8系统下保存出现闪退的解决方案
不知道有没有人和我一样用的是win8系统,同时还遇到保存QQ截图保存闪退.保存sublime文件闪推.系统自带截图保存闪退.....更可恶的是我用chrome中百度搜索“win8保存东西闪退”结果浏览 ...
- 安装gitolite,并ssh公钥无密码登录
安装gitolite,并ssh公钥无密码登录 gitolite是管理git版本库的一种方案,它将git版本库的管理信息放在了一个特殊git版本库里.gitolite与linux操作系统集成了,需要使用 ...
- 安装ipvsadm时出现下面所示错误,MARK
[root@localhost ipvsadm-1.26]# makemake -C libipvsmake[1]: Entering directory `/usr/local/soft/ipvsa ...
- ASP.NET中各种连接数据库的配置
一.数据库连接语句 1.MSSQL数据库链接示例 <connectionStrings> <add name="Conn" connectionString=&q ...
- Oracle 10g 数据文件的第一个数据块结构
一.数据文件的第一个数据块结构kcvfh BBED> set file 1 FILE# 1 BBED> set block 1 BLOCK# 1 --查看第一个数据块的整体结构 BBED& ...