leetcode刷题:前序中序构建二叉树

手算肯定是会的,转换成代码思路就有点混乱。

由前序遍历和中序遍历构建二叉树,首先要明白前序和中序遍历的特点,前序遍历是根-左孩子-右孩子,中序遍历是左孩子-根-右孩子的遍历顺序,因此可以利用前序遍历确定根节点,根节点的左孩子和右孩子分别是左子树和右子树的根节点,可以利用这个关系递归重建。

通过前序遍历序列可以依次找到根节点、左子树的根节点、右子树的根节点、左子树的左子树的根节点、左子树的右子树的根节点…

只要找到该根节点在中序遍历中的位置,就能分成左子树和右子树。

leetcode的代码传参用的是指针,可以直接通过改变指针指向地址和数组大小来达到隔开左子树和右子树并递归传参的目的。

C语言解法

/**

  • Definition for a binary tree node.
  • struct TreeNode {
  • int val;
    
  • struct TreeNode *left;
    
  • struct TreeNode *right;
    
  • };
    */
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
    //先确定根节点的位置,再递归左子树和右子树
    if(preorderSize==0)
    {
        return NULL;
    }
    struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    //此处需要注意当新建root节点时,会同时给left和right指针分配地址,如果不初始化会报错。
    root->left = NULL;
    root->right = NULL;
    root->val = preorder[0];//由于使用指针传参,此处指每个小数组块的第一个元素
    for(int i=0;i<preorderSize;i++)
    {//找到根节点
        if(inorder[i]==root->val)
        {
            root->left = buildTree(preorder+1,i,inorder,i);
            root->right = buildTree(preorder+i+1,preorderSize-i-1,inorder+i+1,inorder-i-1);
            break;
        }
    }
    return root;
}

python2.7.3解法

**

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

**

class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        if len(pre)==0:
            return None
        ret = TreeNode(pre[0])
        index = pre[0]
        for i in range(len(tin)):
            if tin[i]==index:
                ret.left = self.reConstructBinaryTree(pre[1:i+1],tin[:i])
                ret.right = self.reConstructBinaryTree(pre[i+1:],tin[i+1:])
        return ret
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值