手算肯定是会的,转换成代码思路就有点混乱。
由前序遍历和中序遍历构建二叉树,首先要明白前序和中序遍历的特点,前序遍历是根-左孩子-右孩子,中序遍历是左孩子-根-右孩子的遍历顺序,因此可以利用前序遍历确定根节点,根节点的左孩子和右孩子分别是左子树和右子树的根节点,可以利用这个关系递归重建。
通过前序遍历序列可以依次找到根节点、左子树的根节点、右子树的根节点、左子树的左子树的根节点、左子树的右子树的根节点…
只要找到该根节点在中序遍历中的位置,就能分成左子树和右子树。
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