二叉树的的前序遍历和后序遍历(题型变种更新中)
變形一
BM32?合并二叉樹
描述
已知兩顆二叉樹,將它們合并成一顆二叉樹。合并規則是:都存在的結點,就將結點值加起來,否則空的位置就由另一個樹的結點來代替。例如:
兩顆二叉樹是:
????????????????????????????????????????????????????????????????????Tree 1
????????????????????????????????????????????????????????????????????????Tree 2
????????????????????????????????????????????????????????????????????合并后的樹為
數據范圍:樹上節點數量滿足0≤n≤500,樹上節點的值一定在32位整型范圍內。
進階:空間復雜度 O(1)?,時間復雜度 O(n)
示例1
輸入:
{1,3,2,5},{2,1,3,#,4,#,7}返回值:
{3,4,5,5,4,#,7}示例2
輸入:
{1},{}返回值:
{1}前序遍歷
import java.util.*;/** public class TreeNode {* int val = 0;* TreeNode left = null;* TreeNode right = null;* }*/public class Solution {/*** * @param t1 TreeNode類 * @param t2 TreeNode類 * @return TreeNode類*/public TreeNode mergeTrees (TreeNode t1, TreeNode t2) {// write code hereif(t1==null)return t2;if(t2==null)return t1;t1.val+=t2.val;t1.left=mergeTrees(t1.left,t2.left);t1.right=mergeTrees(t1.right,t2.right);return t1; } }?
變形二
BM33?二叉樹的鏡像
描述
操作給定的二叉樹,將其變換為源二叉樹的鏡像。
數據范圍:二叉樹的節點數0≤n≤1000?, 二叉樹每個節點的值? 0≤val≤1000
要求:?空間復雜度 O(n)?。本題也有原地操作,即空間復雜度 O(1)?的解法,時間復雜度 O(n)
比如:
源二叉樹
鏡像二叉樹
示例1
輸入:
{8,6,10,5,7,9,11}返回值:
{8,10,6,11,9,7,5}示例2
輸入:
{}返回值:
{}解題步驟:
1、特判:如果pRoot為空,返回空
2、交換左右子樹
3、把pRoot的左子樹放到Mirror中鏡像一下
4、把pRoot的右子樹放到Mirror中鏡像一下
5、返回根節點root
前序和后序遍歷
import java.util.*;/** public class TreeNode {* int val = 0;* TreeNode left = null;* TreeNode right = null;* public TreeNode(int val) {* this.val = val;* }* }*/public class Solution {/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param pRoot TreeNode類 * @return TreeNode類*/public TreeNode Mirror (TreeNode pRoot) {// write code hereif(pRoot==null){return pRoot;} // //后序遍歷 // TreeNode left=Mirror(pRoot.left); //遞歸左子樹 // TreeNode right=Mirror(pRoot.right); //遞歸右子樹 // //左右子樹交換 // pRoot.left=right; // pRoot.right=left;//前序遍歷也可以TreeNode temp=pRoot.left;pRoot.left=pRoot.right;pRoot.right=temp;pRoot.left=Mirror(pRoot.left);pRoot.right=Mirror(pRoot.right);return pRoot;} }變形三?
BM36?判斷是不是平衡二叉樹
描述
輸入一棵節點數為 n 二叉樹,判斷該二叉樹是否是平衡二叉樹。
在這里,我們只需要考慮其平衡性,不需要考慮其是不是排序二叉樹
平衡二叉樹(Balanced Binary Tree),具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。
樣例解釋:
樣例二叉樹如圖,為一顆平衡二叉樹
注:我們約定空樹是平衡二叉樹。
數據范圍:0n≤100,樹上節點的val值滿足0≤n≤1000
要求:空間復雜度O(1),時間復雜度O(n)
輸入描述:
輸入一棵二叉樹的根節點
返回值描述:
輸出一個布爾類型的值
示例1
輸入:
{1,2,3,4,5,6,7}返回值:
true示例2
輸入:
{}返回值:
true題解:(后序遍歷)
求二叉樹的高度的模板
public class Solution {boolean isb=true; //標記是否是平衡二叉樹public int dfs(TreeNode root){if(root==null){return 0;}//自底向上,先求左右子樹高度int l=dfs(root.left);int r=dfs(root.right);if(Math.abs(l-r)>1){ //(左子樹深度-右子樹深度) > 1,不是平衡樹isb=false;}return Math.max(l,r)+1; //求深度}public boolean IsBalanced_Solution(TreeNode root) {if(root==null){return true;}dfs(root);return isb; } }上面的代碼總是遍歷完全部的節點,如果一判斷到左右子樹的深度之差大于1,即這個二叉樹就不可能再是平衡樹了。所以,我們還可以對上面代碼進行優化。
進行剪枝:當判斷到左右子樹的深度之差大于1的時候,則返回-1。每次遞歸結束判斷返回值是否-1,若為-1,則立即返回。
所以優化后的代碼為:
public class Solution { boolean isb=true;public int dfs(TreeNode root){if(root==null){return 0;}//自底向上,先求左右子樹高度int l=dfs(root.left);if(l==-1){ //如果左子樹已經不是平衡二叉樹,則返回-1,不需要再去訪問右子樹了return -1;}int r=dfs(root.right);if(r==-1){ //如果右子樹已經不是平衡二叉樹,則返回-1,不需要再去訪問遞歸了return -1;}if(Math.abs(l-r)>1){ //(左子樹深度-右子樹深度) > 1,不是平衡樹isb=false;return -1; //提前結束,避免遍歷所有的節點}return Math.max(l,r)+1; //求深度}public boolean IsBalanced_Solution(TreeNode root) {if(root==null){return true;}int len=dfs(root);if(len==-1){return false;}else{return true;}} }變形四
BM37?二叉搜索樹的最近公共祖先
描述
給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。
1.對于該題的最近的公共祖先定義:對于有根樹T的兩個節點p、q,最近公共祖先LCA(T,p,q)表示一個節點x,滿足x是p和q的祖先且x的深度盡可能大。在這里,一個節點也可以是它自己的祖先.
2.二叉搜索樹是若它的左子樹不空,則左子樹上所有節點的值均小于它的根節點的值; 若它的右子樹不空,則右子樹上所有節點的值均大于它的根節點的值
3.所有節點的值都是唯一的。
4.p、q 為不同節點且均存在于給定的二叉搜索樹中。
數據范圍:
3<=節點總數<=10000
0<=節點值<=10000
如果給定以下搜索二叉樹: {7,1,12,0,4,11,14,#,#,3,5},如下圖:
?代碼:
import java.util.*;/** public class TreeNode {* int val = 0;* TreeNode left = null;* TreeNode right = null;* public TreeNode(int val) {* this.val = val;* }* }*/public class Solution {/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param root TreeNode類 * @param p int整型 * @param q int整型 * @return int整型*/public int lowestCommonAncestor (TreeNode root, int p, int q) {// write code here//避免了判斷p,q值那個大if((p-root.val)*(q-root.val)<=0){ //兩個節點值在root左右兩邊return root.val;}else if(p>root.val&&q>root.val){return lowestCommonAncestor(root.right,p,q);}else{return lowestCommonAncestor(root.left,p,q);}}}變形五(一般二叉樹找最近公共節點)(前序遍歷)
import java.util.*;/** public class TreeNode {* int val = 0;* TreeNode left = null;* TreeNode right = null;* public TreeNode(int val) {* this.val = val;* }* }*/public class Solution {/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param root TreeNode類 * @param p int整型 * @param q int整型 * @return int整型*/public int lowestCommonAncestor (TreeNode root, int p, int q) { //一般二叉樹if(root==null){ //沒有找到p或者qreturn -1; //返回-1}//前序遍歷:根左右if(root.val==p||root.val==q){ //如果遍歷到其中一個節點,則該節點就是兩個節點最近祖先return root.val; //兩個節點的祖先}int l=lowestCommonAncestor(root.left,p,q);int r=lowestCommonAncestor(root.right,p,q);if(l==-1){ //如果左子樹中沒有兩個節點p,q,則說明兩個節點都在右子樹上return r; //返回右子樹第一個遇到的節點,就是最近公共祖先}if(r==-1){ //如果右子樹中沒有兩個節點p,q,則說明兩個節點都在左子樹上return l; // 返回右子樹第一個遇到的節點,就是最近公共祖先}return root.val; //如果左右子樹各有一個節點值,則他們的最近公共節點是root.val} }總結
以上是生活随笔為你收集整理的二叉树的的前序遍历和后序遍历(题型变种更新中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中序遍历的模板(以及变形更新中。。。)
- 下一篇: 初学Jedis