LeetCode--二叉樹系列(一)
617.合併二叉樹
給定兩個二叉樹,想象當你將它們中的一個覆蓋到另一個上時,兩個二叉樹的一些節點便會重疊。
你需要將他們合併為一個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 NULL 的節點將直接作為新二叉樹的節點。
解法1:遞迴解決,以t1為基樹,若t1為null則採用t2節點值,若t2也為空,則不需要了。按照根節點與左右節點依次遞迴。
/** * 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* mergeTrees(TreeNode* t1, TreeNode* t2) { merge(t1,t2); return t1; } void merge(TreeNode* &t1, TreeNode* &t2) { if(t1==nullptr) t1 = t2; else { if(t2==nullptr) return; else { t1->val+=t2->val; merge(t1->left,t2->left); merge(t1->right,t2->right); } } } };
226.翻轉二叉樹
翻轉一棵二叉樹。
示例:
輸入:
4 / \ 2 7 / \ / \ 1 3 6 9
輸出:
4 / \ 7 2 / \ / \ 9 6 3 1
解法:先翻轉左右子樹,然後分別對左右子數的左右節點進行翻轉
/** * 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: void exchange(TreeNode* root) { TreeNode* node = root; if(node!=NULL) { TreeNode* tmp = node->left; node->left = node->right; node->right = tmp; } } TreeNode* invertTree(TreeNode* root) { TreeNode* node = root; if(root==NULL) return root; invertTree(node->left); invertTree(node->right); exchange(node); return root; } };
144.二叉樹的前序遍歷
解法1:遞迴求解(根左右)
解法2:利用棧,首先把root壓入,然後再把右子樹壓入,再把左子樹壓入。
解法一: /** * 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: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; preorder(root,res); return res; } void preorder(TreeNode* root,vector<int>& res) { if(root==NULL) return; res.push_back(root->val); preorder(root->left,res); preorder(root->right,res); } }; 解法二: /** * 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: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if(root==NULL) return res; stack<TreeNode*> stk; stk.push(root); while(!stk.empty()) { auto node = stk.top(); res.push_back(node->val); stk.pop(); if(node->right!=NULL) stk.push(node->right); if(node->left!=NULL) stk.push(node->left); } return res; } };
相關推薦
LeetCode--二叉樹系列(一)
617.合併二叉樹 給定兩個二叉樹,想象當你將它們中的一個覆蓋到另一個上時,兩個二叉樹的一些節點便會重疊。 你需要將他們合併為一個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 NULL 的節點將直接作為新二叉樹的節點。
LeetCode--二叉樹系列(二)
112.路徑總和 解法:如果根節點值==target停止搜尋。每次回朔採用sum-root->val /** * Definition for a binary tree node. * struct TreeNode { * int val; *
【Leetcode | 5】二叉樹系列(十三)
traversal href first for binary {} while leet auto 一、 二、 五、二叉樹的垂直遍歷 題目:987. Vertical Order Traversal of a Binary Tree C++ Soution
【資料結構之二叉樹】(一)B樹、B-樹、B+樹、B*樹介紹,和B+樹更適合做檔案索引的原因
今天看資料庫,書中提到:由於索引是採用 B 樹結構儲存的,所以對應的索引項並不會被刪除,經過一段時間的增刪改操作後,資料庫中就會出現大量的儲存碎片,這和磁碟碎片、記憶體碎片產生原理是類似的,這些儲存碎片不僅佔用了儲存空間,而且降低了資料庫執行的速度。如果發現索引
OptimalSolution(2)--二叉樹問題(4)子樹與拓撲結構
kmp ole 結點 mp算法 返回 str 序列 || 開始 一、判斷t1樹是否包含t2樹全部的拓撲結構 1 / 2 3 2 / \ /
題解 洛谷P5018【對稱二叉樹】(noip2018T4)
\(noip2018\) \(T4\)題解 其實呢,我是覺得這題比\(T3\)水到不知道哪裡去了 畢竟我比較菜,不大會\(dp\) 好了開始講正事 這題其實考察的其實就是選手對D(大)F(法)S(師)的掌握程度 考完試有人說這題是馬拉車,嚇死我了 首先,你把資料讀入之後,先用一個大
二叉樹深度(Depth)`遞迴`與`非遞迴`
二叉樹 (`Depth`)遞迴 深度優先遍歷 DFS 二叉樹的高度(深度)為二叉樹結點層次的最大值,也可以認為在根節點不為 nullptr 的情況下左右子樹的最大高度 + 1; 先序(後序)遍歷求解二叉樹高度(Depth)的遞迴演算法 演算法描述:深度優先遍歷
二叉樹重建(c++)
題目描述(劍指offer) 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
12166 Equilibrium Mobile(括號處理+二叉樹+數論(?))
雖然在上邊寫了二叉樹但是確實不關二叉樹的事情。 這是一個關於天平平衡以及要不要改動的問題。 乍看其實是簡單的,但是漸漸會發現這東西和我的程式碼一樣,牽一髮動全身(= =|||)。 我第一個想法是找到第一個葉子,然後和邊上的比,那麼問題來了,如果不一樣改哪個葉子,都改?絕
決策樹系列(一)——基礎知識回顧與總結
決策樹系列(一)——基礎知識回顧與總結 1.決策樹的定義 樹想必大家都會比較熟悉,是由節點和邊兩種元素組成的結構。理解樹,就需要理解幾個關鍵詞:根節點、父節點、子節點和葉子節點。 父節點和子節點是相對的,
資料結構中排序演算法- 二叉樹排序(7)
1,二叉樹排序演算法 基本思想:二叉排序樹:要麼是空樹,要麼滿足以下條件:若左子樹不空,則左子樹所有結點的值均小於根結點的值,若右子樹不空,右子樹所有結點的值均大於根結點的值;左子樹和右子樹也是一顆二叉排序樹。對於二叉排序樹進行中序遍歷,得到就是一個有序的序列。因此二叉樹排
二叉樹編碼(陣列)
int tree[3] 3 5 8 2 6 9 7 3(0) 5(1)
演算法習題15:二叉樹映象(翻轉)
題目:輸入一顆二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。用遞迴和迴圈兩種方法完成樹的映象轉換。 例如輸入: 8 / \ 6 10 /\ /\5 7 9 11輸出: 8 / \ 10 6 /\ /\11 9 7
leetcode 二叉樹系列搞定
偶爾做幾個題這樣也就慢慢把leetcode上二叉樹系列的題目做完了,一共26個題(sigh...一個收費題沒刷) , 二叉樹系列的題最普遍的解法就是遞迴了,所以一般先往遞迴上想就okay了~ 非遞迴演算法的話一般都會用到stack, queue等,然後一個while迴圈 迭
演算法基礎(八):超詳細最優二叉樹構建(1)
赫夫曼(Huffman)樹也稱最有二叉樹,是一類帶全路徑長度最短的樹,有著廣泛的應用。比如一棵判定樹,根據學生的成績劃分及格還是不及格還是優、中等、良好。顯然用if-else或者switch就可以簡單實現,當然可以直接毫不考慮的直接這樣寫,但是如果我們再肯花點功夫,就可以得
二叉樹演算法(java)
二叉樹的展示功能(中序遍歷) private void show(Node node) { if (node != null) { this.show(node.leftChildNode); System.out.println(node.key + ":" + node.value);
LeetCode 145 Binary Tree Postorder Traversal(二叉樹的興許遍歷)+(二叉樹、叠代)
int truct fin for data- right class span popu 翻譯 給定一個二叉樹。返回其興許遍歷的節點的值。 比如: 給定二叉樹為 {1。 #, 2, 3} 1 2 / 3 返回
LeetCode:114. Flatten Binary Tree to Linked List(固定二叉樹為連結串列)
Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 / \ 2 5 / \ \ 3 4 6 The f
LeetCode 94 Binary Tree Inorder Traversal(二叉樹的中序遍歷)+(二叉樹、迭代)
翻譯 給定一個二叉樹,返回其中序遍歷的節點的值。 例如: 給定二叉樹為 {1, #, 2, 3} 1 \ 2 / 3 返回 [1, 3, 2] 備註:用遞
二叉樹系列--層序遍歷(java實現)
記錄兩道題目: 第一題:計算二叉樹的深度,兩行遞迴即可搞定。 public static int level(Node root) { if (root == null) return 0; return level(root.left) + 1 > l