leetcode 105. 从前序与中序遍历序列构造二叉树 c语言递归解法
如題:
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。 注意: 你可以假設樹中沒有重復的元素。例如,給出 前序遍歷 preorder =?[3,9,20,15,7] 中序遍歷 inorder = [9,3,15,20,7] 返回如下的二叉樹:3/ \9 20/ \15 7套路題,考察你有沒有學習過這種題型。同樣的問題還有知道中序與后序構造二叉樹(leetcode 106)。我們知道,前序遍歷所得序列從左至右依次是:根節點,跟左子樹根節點.....右子樹根節點。和后序正好相反,后序遍歷所得序列從后往前依次是根節點,根右子樹根節點...左子樹根節點。因為題目保證沒有重復數字,知道了根節點,就可以從中序遍歷中找到對應下標i,根據中序遍歷性質,i左邊的數列表示左子樹,i右邊的數列表示右子樹。這樣,我們知道了根結點后,遞歸從中序數列中分別查找左子樹的根結點和右子樹根結點即可。
示例中給出的前序遍歷數列為【3,9,20,15,7】,由下面的二叉樹可以觀察到,結點3為根結點,9為3的左子樹根結點,20為3右子樹根結點。15為20左子樹根結點,7為20右子樹根結點。遞歸查找順序由此可得,先左子樹后右子樹。總的來說就是找根結點的過程。沒有看懂的同學可以結合下面的代碼看下:
//這道題和已知中序于后序遍歷求二叉樹類似,僅僅方向不同,遞歸求解即可 struct TreeNode *findSubRoot(int* preorder, int* inorder, int *preOrderEnd, int inStart, int inEnd) {int i, val;struct TreeNode *root, *left, *right;//中序序列找不到,說明是一個空節點if (inStart > inEnd)return NULL;//從前序遍歷中取出根節點的值val = preorder[*preOrderEnd];//指向下一個子樹的根節點*preOrderEnd = *preOrderEnd + 1;//找到val節點的左子樹和右子樹范圍for (i = 0; i <= inEnd; i++)if (inorder[i] == val)break;//找到val的左子樹與右子樹,順序不能反,先左后右left = findSubRoot(preorder, inorder, preOrderEnd, inStart, i - 1);right = findSubRoot(preorder, inorder, preOrderEnd, i + 1, inEnd);//組合root = (struct TreeNode *)calloc(1, sizeof(struct TreeNode));root->val = val;root->left = left;root->right = right;return root; }struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){//前序遍歷從前往后依次是根結點int preOrderEnd = 0;return findSubRoot(preorder, inorder, &preOrderEnd, 0, inorderSize - 1); }?
=============================================================================================
Linux應用程序、內核、驅動開發交流討論群(745510310),感興趣的同學可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。
總結
以上是生活随笔為你收集整理的leetcode 105. 从前序与中序遍历序列构造二叉树 c语言递归解法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360借条注销了怎么恢复
- 下一篇: 招商银行e闪贷怎么才能申请通过