【剑指offer】面试题6:重建二叉树
来源:互联网 发布:c 不定长度数组 编辑:程序博客网 时间:2024/06/06 04:53
题目就是输入前序和中序来实现二叉树的重建,虽然感觉自己人为操作思路很清晰,但是写到程序里会觉得很繁琐,以前实现过,但是如果是面试的话,还是要熟练才好,真正理解每一句代码的思路。所以也算是克服恐惧来仔细分析一次吧。
(我没有用书上的代码来分析,而是用之前自己参照网上的版本写的)
typedef struct BinaryTreeNode{ int value; BinaryTreeNode* pLeft; BinaryTreeNode* pRight;}BinaryTreeNode;
结构体如上;
之前的实现(也是参照网上流传很广的版本):
BinaryTreeNode* buildByPreAndIn(int* pre_order, int* in_order, int num) { if (pre_order == NULL || in_order == NULL || num <= 0) return NULL; BinaryTreeNode* root = new BinaryTreeNode; root->value = *pre_order; root->pLeft = root->pRight = NULL; int rootPositionInOrder = -1; for (int i = 0; i < num; i++) { if (in_order[i] == root->value) { rootPositionInOrder = i; break; } } int num_Left = rootPositionInOrder; int num_Right = num - num_Left - 1; int* pre_order_left = pre_order + 1; int* in_order_left = in_order; root->pLeft = buildByPreAndIn(pre_order_left, in_order_left, num_Left); int* pre_order_right = pre_order + num_Left + 1; int* in_order_right = in_order + num_Left + 1; root->pRight = buildByPreAndIn(pre_order_right, in_order_right, num_Right); return root;}
好的我们先看函数头:
BinaryTreeNode* buildByPreAndIn(int* pre_order, int* in_order, int num);
前两个参数就是前序和中序数组的首地址,那么num呢?就是数组的长度(两个一样长)。
然后是终止条件,也很清晰;
接着用前序数组的第一个元素,创建一个节点,既是根节点,又是之后每次递归的时候创建的新节点。
然后去找中序数组中,前序数组第一个节点的位置,以此来区分左右子树。
然后用两个变量:
num_Left记录左子树节点的个数;
num_Right记录右子树节点的个数;
知道了长度,还要知道前序中序两个数组的首地址吧,然后再用两个变量:
pre_order_left记录左子树前序子数组的起始位置;
in_order_left记录左子树中序子数组的起始位置;
两个长度相等,所以递归调用函数创建左子树。
右子树是相同的过程,重要的是找起始位置的时候要空出根节点。
然后返回创建的树的根节点。
这样一分析,就觉得思路更加明晰了,我觉得就算是面试,也是要记下这个思路吧。
1 0
- 《剑指Offer》面试题-重建二叉树
- 剑指offer--面试题6: 重建二叉树(树)
- 剑指offer-->面试题6 重建二叉树
- 【剑指offer】面试题6:重建二叉树
- 《剑指offer》面试题6:重建二叉树
- 剑指offer 面试题6 重建二叉树
- 剑指Offer:面试题6 重建二叉树
- 《剑指offer》面试题6:重建二叉树
- 《剑指offer》面试题6重建二叉树
- 剑指offer面试题6--重建二叉树
- 理解《剑指Offer》之面试题6 重建二叉树
- 剑指offer 面试题6 重建二叉树
- 剑指offer面试题6 重建二叉树(c)
- 剑指offer面试题6 重建二叉树(java)
- 《剑指Offer》面试题6:重建二叉树
- 剑指offer--面试题6:重建二叉树--Java实现
- 【剑指Offer学习】【面试题6 :重建二叉树】
- 《剑指Offer》学习笔记--面试题6:重建二叉树
- Swift-->NSUserDefaults键值对,Android中的SharedPreferences
- lambda表达式更新数据库
- c#事件复习
- Swing超基础学习总结——5、菜单(JMenu、JMenuBar、JMenuItem)
- css属性之边框属性
- 【剑指offer】面试题6:重建二叉树
- C++ hdoj 2040
- com.sun.proxy.$Proxy25 cannot be cast to com.levi.service.impl.ProductServiceImpl和proxy-target-class
- Sklearn 用户手册 一:机器学习初体验
- IPC之Posix信号量详解
- 白盒测试方法和工具
- android网络HTTP和TCP
- c#协变-逆变复习
- R的神经网络包