【剑指offer】面试题6:重建二叉树

题目就是输入前序和中序来实现二叉树的重建,虽然感觉自己人为操作思路很清晰,但是写到程序里会觉得很繁琐,以前实现过,但是如果是面试的话,还是要熟练才好,真正理解每一句代码的思路。所以也算是克服恐惧来仔细分析一次吧。

(我没有用书上的代码来分析,而是用之前自己参照网上的版本写的)

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值