合併二叉樹(3種解法)

2021-10-07 12:34:19 字數 1644 閱讀 7856

題目

合併二叉樹(力扣:617)

給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。

你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。

分析合併兩個二叉樹,可以使用遞迴和遍歷兩種方式求解。

遞迴求解:兩個二叉樹t1、t2中,如果乙個為空,則返回另乙個;將t1的值修改為t1的值+t2的值;遞迴,讓t1的left等於合併後的t1.left和t2.left,右子樹同理;最後返回t1。

遍歷求解:也可以使用遍歷的方式求解。遍歷兩顆二叉樹,將二叉樹每個節點的值相加即可。

**實現:遞迴

/**

* 617. 合併二叉樹

* @param t1

* @param t2

* @return

*/public treenode mergetrees(treenode t1, treenode t2)

t1.val += t2.val;

t1.left = mergetrees(t1.left, t2.left);

t1.right = mergetrees(t1.right, t2.right);

return t1;

}

擴充套件:不修改原二叉樹解法。

/**

* 617. 合併二叉樹 不修改原樹

* @param t1

* @param t2

* @return

*/public treenode mergetrees2(treenode t1, treenode t2)

treenode node = new treenode((t1 != null ? t1.val : 0) + (t2 != null ? t2.val : 0));

node.left = mergetrees2(t1 != null ? t1.left : null, t2 != null ? t2.left:null);

node.right = mergetrees2(t1 != null ? t1.right : null, t2 != null ? t2.right:null);

return node;

}

**實現:層序遍歷
/**

* 617. 合併二叉樹

* @param t1

* @param t2

* @return

*/public treenode mergetrees2(treenode t1, treenode t2)

if (t2 == null)

linkedlistlinkedlist = new linkedlist<>();

linkedlist.add(t1);

linkedlist.add(t2);

while (!linkedlist.isempty())else if (n1.left == null)

if (n1.right != null && n2.right != null)else if (n1.right == null)

}return t1;

}

二叉樹3(恢復二叉樹)

給一顆帶權 權值各不相同,都是小於10000的正整數 的二叉樹的中序和後序遍歷序列,找乙個葉子使得它到根的路徑上的權值盡可能小,如果有多解,取葉子權值小的。輸入中第一行為中序遍歷,第二行為後序遍歷。例如輸入 3 2 1 4 5 7 6 3 1 2 5 6 7 4 輸出輸入 7 8 11 3 5 16...

重建二叉樹(Python and C 解法)

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 3 9 20 15 7 根節點 左...

617 合併二叉樹

給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。示例 1 輸入 tree 1 tree 2 1 2 3 2...