日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉树的的前序遍历和后序遍历(题型变种更新中)

發布時間:2024/9/21 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的的前序遍历和后序遍历(题型变种更新中) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

變形一

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} }

總結

以上是生活随笔為你收集整理的二叉树的的前序遍历和后序遍历(题型变种更新中)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。