牛客网刷题--剑指offer(重建二叉树)

来源:互联网 发布:excel对比2张表的数据 编辑:程序博客网 时间:2024/04/24 02:42

题目描述是这样的:
给你一个树的前序遍历和中序遍历,希望你能重建这个二叉树的结构,题目还给了一个例子:某二叉树的前序遍历为{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历{4, 7, 2, 1, 5, 3, 8, 6},重建二叉树并返回该二叉树的根指针。
这里,我们需要清楚,要想重建二叉树,我们必须已知某二叉树的中序遍历序列,也就是说,只要知道前序,中序或这中序,后序遍历序列都是可以重建出二叉树的,但是若只知道前序和后序序列的二叉树,我们是不能重建出二叉树的。
那怎么重建二叉树呢?递归当然是最方便的了。因为前序遍历,所以第一个结点是根结点,根结点找到之后,当然要在中序遍历找了,而中序遍历中的根结点左边的所有结点就是该根结点的左子树结点,该根结点右边的所有结点是该根结点的右子树。我们先处理左子树,左子树又是一个二叉树,我们能从前边的前序遍历和中序遍历中找到该二叉树的所有结点,又组成了一个新的前序遍历和中序遍历序列,这样重建这个新的二叉树。左子树处理完了之后在处理右子树,完成递归操作。
递归的逻辑清楚了,那以什么来结束递归操作呢?经过分析(所谓的分析就是自己动手在纸上划,让笔头划的指针像程序那样跑起来,就能找到其中的结束条件),结束条件是指向前序序列的头指针和尾指针指向同一元素且指向中序序列的头指针和尾指针指向同一元素且前序序列指针指向的元素和中序序列指针指向的元素相同,那么,就可以说,我遍历完了所有的前序序列和中序序列,可以返回了。
那什么时候重建二叉树的左子树呢?当然是当左子树有结点了,同理,我们需要计算右子树的结点数大于零,就要递归重建右子树。
这次写代码是非常的顺利,经过上次两个编程(奶牛问题和选镇长问题),我的代码在本地上是能跑通的,可是到了牛客网的编译器,就是运行时间过长,递归层数过深等问题,很打击我的编程信心,但是这次,我在纸上写了一边,确定逻辑都没有错误之后,就在牛客网提供的编译器上敲,没想到,一次就通过了。所以只要代码的逻辑正确,就大胆的提交运行吧。我的奶牛问题和选镇长问题过一段时间在回过头来看看吧,也许过一段时间,就能编译通过。
现将重建二叉树代码粘贴如下,以供后面查阅:

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    struct TreeNode * subTree(vector<int> pre, int preStart, int preEnd, vector<int> in, int inStart, int inEnd) {        struct TreeNode * rootTree = (struct TreeNode *) malloc (sizeof(struct TreeNode));        rootTree -> val = pre[preStart];        rootTree -> left = NULL;        rootTree -> right = NULL;        if (preStart == preEnd && inStart == inEnd && pre[preStart] == in[inStart])            return rootTree;        int rootIndex = inStart;        while (in[rootIndex] != pre[preStart])            rootIndex ++;        int newLength = rootIndex - inStart;        if (newLength > 0)            rootTree -> left = subTree(pre, preStart + 1, preStart + newLength, in, inStart, rootIndex - 1);        if (inEnd - rootIndex > 0)            rootTree -> right = subTree(pre, preStart + newLength + 1, preEnd, in, rootIndex + 1, inEnd);        return rootTree;    }    struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {        int preLength = pre.size();        int inLength = pre.size();        if (preLength == 0 || inLength == 0)            return NULL;        return subTree(pre, 0, preLength - 1, in, 0, inLength - 1);    }};
0 0
原创粉丝点击