日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树

發(fā)布時間:2024/4/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Construct Binary Tree from Preorder and Inorder Traversal

原題鏈接Construct Binary Tree from Preorder and Inorder Traversal

給定一個二叉樹的先序遍歷和中序遍歷,要求重現(xiàn)這棵二叉樹

另先序遍歷的序列為preorder,中序遍歷的序列為inorder,節(jié)點個數(shù)為n

根據(jù)先序遍歷的特點,可知preorder[0]一定是整棵二叉樹的根節(jié)點,那么,如果已確定根節(jié)點值在中序遍歷序列inorder中的下標是i,就一定有

  • inorder[0 : i - 1]這些值屬于根節(jié)點的左子樹
  • inorder[i + 1, n - 1]這些值屬于根節(jié)點的右子樹

因為中序遍歷是從最左邊開始遍歷,所以當遍歷到根節(jié)點inorder[i]時,之前遍歷到的節(jié)點一定都屬于左子樹

那么現(xiàn)在的目的就是如何確定左右子樹的根節(jié)點,由先序遍歷可知

  • preorder[0 + 1]一定是左子樹的根節(jié)點
  • preorder[0 + 1 + (i - 0)]一定是右子樹的根節(jié)點

因為先序遍歷遍歷到的節(jié)點順序是從根節(jié)點到最左邊,再到右邊,那么既然已經(jīng)直到左子樹上有多少節(jié)點了(i - 0個),那么就可以確定右子樹的根節(jié)點

直接遞歸即可

/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return buildTree(0, 0, inorder.size() - 1, preorder, inorder); } private:/* preStart : 當前根節(jié)點在preorder中的下標* [inStart:inEnd] : 以preorder[preStart]為根節(jié)點的子樹的節(jié)點值在inorder的范圍*/TreeNode* buildTree(int preStart, int inStart, int inEnd, vector<int>& preorder, vector<int>& inorder){if(preStart >= preorder.size() || inStart > inEnd)return nullptr;/* 申請根節(jié)點 */TreeNode* root = new TreeNode(preorder[preStart]);/* 尋找根節(jié)點在inorder的位置,拆分左右子樹 */int inIndex = 0;for(int i = inStart; i <= inEnd; ++i){if(inorder[i] == preorder[preStart]){inIndex = i;break;}}root->left = buildTree(preStart + 1, inStart, inIndex - 1, preorder, inorder);root->right = buildTree(preStart + 1 + inIndex - inStart, inIndex + 1, inEnd, preorder, inorder);return root;} };

本題主要需要弄清楚如何進行遞歸,當然拆分成左右子樹是個很好的方法,不夠不太容易想到。

先序遍歷可以直到根節(jié)點,而中序遍歷可以確定該根節(jié)點的左右子樹的取值范圍,從而不斷拆分下去,最終求解

總結

以上是生活随笔為你收集整理的每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。