1. 程式人生 > >LeetCode--二叉樹系列(一)

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