劍指 Offer 07 重建二叉樹(C語言)

2022-09-09 17:21:25 字數 1732 閱讀 9977

輸入某二叉樹的前序遍歷和中序遍歷的結果,請構建該二叉樹並返回其根節點。

假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

詳情:點選這裡

/*!

* @file 07buildtree.c

* @date 2021-08

* @version 0.1

* @author forbit

* @brief 構建二叉樹的時候採用分塊的思想,拆分二叉樹,更容易實現。

* @details score 24-44ms 7.2-7.6mb

*//**

* definition for a binary tree node.

* struct treenode ;

*/struct treenode* buildtree(int* preorder, int preordersize, int* inorder, int inordersize)

void buil_tree( struct treenode* tree_p,

int *p_array,

int p_num,

int *p_array_preorder)

//! 判斷存在右子樹

if(root_indexval) root_index=i;

// 除錯

printf("h**e a left son\n");

printf("p_array[0]:%d, p_num:%d,p_array_preorder[0]:%d,p_array_preorder:%d, tree->val(root):%d\n",p_array[0],p_num,p_array_preorder[0],p_num,tree_p->val);

//! 開闢空間

struct treenode* tree_left = (struct treenode*)malloc(sizeof(struct treenode));

tree_left->left=null; tree_left->right=null;

tree_p->left=&tree_left->val;

//! 給左子樹賦值

tree_left->val=p_array_preorder[1];

//! 更新p_array, p_num,p_array_preorder

for(int i=0; ival) root_index=i;

p_array=&p_array[0];

p_num=root_index;

p_array_preorder=&p_array_preorder[1];

// 除錯

printf("p_array[0]:%d, p_num:%d,p_array_preorder[0]:%d,p_array_preorder:%d, tree_left->val(root):%d\n",p_array[0],p_num,p_array_preorder[0],p_num,tree_left->val);

//! 遞迴

buil_tree( tree_left,

p_array,

p_num,

p_array_preorder);

}void build_right( struct treenode* tree_p,

int *p_array,

int p_num,

int *p_array_preorder)

劍指offer07 重建二叉樹

這是乙個非常高頻的面試題。題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例子 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 思路 題目給出了前序和中序遍歷,我們可以知道前序的...

劍指 Offer 07 重建二叉樹

難度 中等 題目描述 解題思路 這道題之前做過,但是忘得乾乾淨淨了。現在再做一遍撿一撿,說不定哪次面試就出到了呢 總體思想就是遞迴,用雜湊表來儲存對應的中序遍歷的下標,空間換時間,免得每次都要去遍歷找下標。然後每次遞迴的時候,要給對應的左子樹和右子樹在對應陣列裡的下標,左端點大於右端點的時候返回空。...

劍指 Offer 07 重建二叉樹

首先要懂得前序遍歷和中序遍歷,可以寫出兩個陣列,自己手動來重建一下二叉樹,來看看重建二叉樹是怎麼乙個流程。以圖中給出的二叉樹為例,根據前序遍歷的特點,可知前序遍歷的首尾數字是根節點,比如這個時候根節點數值為3,可以在中序遍歷中第2個位置找到數值3,在3左邊的9為3的左子樹,右邊的15,20,7為右子...