題目
合併二叉樹(力扣: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...