摘要:判斷兩棵樹(shù)是否是相同題目要求傳入兩棵樹(shù)的根節(jié)點(diǎn),判斷這兩棵樹(shù)是否相同此題的核心就在于如何遍歷樹(shù)。定義樹(shù)的一種自然方式是遞歸的方式。一棵樹(shù)是一些節(jié)點(diǎn)的集合,這個(gè)集合可以是空集。這個(gè)遍歷算法可以用于場(chǎng)景如,計(jì)算一個(gè)節(jié)點(diǎn)的高度。
判斷兩棵樹(shù)是否是相同
題目要求:傳入兩棵樹(shù)的根節(jié)點(diǎn),判斷這兩棵樹(shù)是否相同
此題的核心就在于如何遍歷樹(shù)。一旦我們解決了這個(gè)問(wèn)題,題目也就迎刃而解了。
下面就來(lái)介紹一下 關(guān)于樹(shù)的一些基本知識(shí)
樹(shù)(tree)可以用幾種方式定義。定義樹(shù)的一種自然方式是遞歸的方式。一棵樹(shù)是一些節(jié)點(diǎn)的集合,這個(gè)集合可以是空集。若不是空集,則樹(shù)由叫做根(root)的節(jié)點(diǎn)r以及0個(gè)或多個(gè)非空子樹(shù)T1,T2...Tk組成,這些子樹(shù)中每一棵的根都被來(lái)自根r的一條有向的邊(edge)所連結(jié)。
節(jié)點(diǎn)的深度: 從根到該節(jié)點(diǎn)的唯一的路徑的長(zhǎng)
二叉樹(shù): 一個(gè)每個(gè)節(jié)點(diǎn)都不能有多于兩個(gè)兒子的樹(shù)
題目中二叉樹(shù)的節(jié)點(diǎn)表示為
class TreeNode{ //節(jié)點(diǎn)的值 int val; //左子節(jié)點(diǎn),可以為null TreeNode left; //右子節(jié)點(diǎn),可以為null TreeNode right; TreeNode(int x) { val = x; } }2.二叉樹(shù)的遍歷方法
中序遍歷:首先處理左子樹(shù),然后是當(dāng)前節(jié)點(diǎn),最后處理右子樹(shù)。這個(gè)算法的總的運(yùn)行時(shí)間是O(N),這是因?yàn)樵跇?shù)的每一個(gè)節(jié)點(diǎn)處進(jìn)行的工作是常數(shù)時(shí)間,一共有n個(gè)節(jié)點(diǎn),所以運(yùn)行時(shí)間為O(N)
后序遍歷:先處理左子樹(shù),再處理右子樹(shù),然后再處理當(dāng)前節(jié)點(diǎn)。這個(gè)遍歷算法可以用于場(chǎng)景如,計(jì)算一個(gè)節(jié)點(diǎn)的高度。
先序遍歷:先處理當(dāng)前節(jié)點(diǎn),在處理左子樹(shù)和右子樹(shù)
層序遍歷:所有深度為d的節(jié)點(diǎn)要在深度d+1的節(jié)點(diǎn)之前重組
//二叉樹(shù)的中序遍歷 //遞歸 void inOrder(TreeNode node){ if(node!=null){ inOrder(node.left); visit(node); inOrder(node.right); } } //二叉樹(shù)的中序遍歷 //非遞歸 需要利用棧 void inOrder(TreeNode node){ Stack3.本題的解法s = new Stack (); TreeNode temp = node; for( ; ; ){ //訪問(wèn)左節(jié)點(diǎn) while(temp!=null){ s.push(temp); temp = temp.left; } //從左節(jié)點(diǎn)回來(lái),訪問(wèn)右節(jié)點(diǎn) if(!s.isEmpty()){ temp = s.pop(); //訪問(wèn)當(dāng)前節(jié)點(diǎn) System.out.println(temp.val); temp = temp.right; }else{ return; } } } //二叉樹(shù)的后序遍歷 void postOrder(TreeNode node){ if(node!=null){ postOrder(node.left); postOrder(node.right); visit(node); } } //二叉樹(shù)的前序遍歷 void preOrder(TreeNode node){ if(node!=null){ visit(node); preOrder(node.left); preOrder(node.right); } }
** * @author rale * leetcode100 * Given two binary trees, write a function to check if they are equal or not. * Two binary trees are considered equal if they are structurally identical and the nodes have the same value. */ public class SameTree { //遞歸 即當(dāng)前值和左右子樹(shù)都相等,則是相同的樹(shù),否則不是 public boolean isSameTree(TreeNode p, TreeNode q) { if(p==null){ return q==null?true:false; }else if(q==null){ return p==null?true:false; } if(p.val == q.val){ return isSameTree(p.left,q.left)&&isSameTree(p.right, q.right); }else{ return false; } } //循環(huán) 中序遍歷 public boolean isSameTree2(TreeNode p, TreeNode q){ StackstackP = new Stack (); Stack stackQ = new Stack (); if(p!=null){ stackP.push(p); } if(q!=null){ stackQ.push(q); } while(!stackP.isEmpty() && !stackQ.isEmpty()){ TreeNode tempP = stackP.pop(); TreeNode tempQ = stackQ.pop(); if(tempP.val!=tempQ.val){ return false; } if(tempP.right!=null){ stackP.push(tempP.right); } if(tempQ.right!=null){ stackQ.push(tempQ.right); } if(stackP.size()!=stackQ.size()){ return false; } if(tempP.left!=null){ stackP.push(tempP.left); } if(tempQ.left!=null){ stackQ.push(tempQ.left); } if(stackP.size()!=stackQ.size()){ return false; } } return stackP.size()==stackQ.size(); } public class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } }
想要了解更多開(kāi)發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/66848.html
摘要:月下半旬攻略道題,目前已攻略題。目前簡(jiǎn)單難度攻略已經(jīng)到題,所以后面會(huì)調(diào)整自己,在刷算法與數(shù)據(jù)結(jié)構(gòu)的同時(shí),攻略中等難度的題目。 Create by jsliang on 2019-07-30 16:15:37 Recently revised in 2019-07-30 17:04:20 7 月下半旬攻略 45 道題,目前已攻略 100 題。 一 目錄 不折騰的前端,和咸魚(yú)有什么區(qū)別...
摘要:微信公眾號(hào)記錄截圖記錄截圖目前關(guān)于這塊算法與數(shù)據(jù)結(jié)構(gòu)的安排前。已攻略返回目錄目前已攻略篇文章。會(huì)根據(jù)題解以及留言內(nèi)容,進(jìn)行補(bǔ)充,并添加上提供題解的小伙伴的昵稱和地址。本許可協(xié)議授權(quán)之外的使用權(quán)限可以從處獲得。 Create by jsliang on 2019-07-15 11:54:45 Recently revised in 2019-07-15 15:25:25 一 目錄 不...
摘要:因此題目中的例子的中序遍歷結(jié)果為。但是,標(biāo)準(zhǔn)的中序遍歷并不能使我們將該結(jié)果反構(gòu)造成一棵樹(shù),我們丟失了父節(jié)點(diǎn)和子節(jié)點(diǎn)之間的關(guān)系。這里我們也可以明顯的看出來(lái),中序遍歷需要保存的空值遠(yuǎn)遠(yuǎn)多于廣度優(yōu)先遍歷。 題目要求 Serialization is the process of converting a data structure or object into a sequence of ...
摘要:遞歸法復(fù)雜度時(shí)間空間遞歸棧空間思路如果兩個(gè)根節(jié)點(diǎn)一個(gè)為空,一個(gè)不為空,或者兩個(gè)根節(jié)點(diǎn)值不同,說(shuō)明出現(xiàn)了不一樣的地方,返回假。代碼遞歸法復(fù)雜度時(shí)間空間遞歸棧空間思路其實(shí)和寫法是一樣的,是比較兩個(gè)節(jié)點(diǎn)的兩個(gè)左邊,然后再比較兩個(gè)節(jié)點(diǎn)的兩個(gè)右邊。 Same Tree Given two binary trees, write a function to check if they are eq...
摘要:題目要求將二叉搜索樹(shù)序列化和反序列化,序列化是指將樹(shù)用字符串的形式表示,反序列化是指將字符串形式的樹(shù)還原成原來(lái)的樣子。假如二叉搜索樹(shù)的節(jié)點(diǎn)較多,該算法將會(huì)占用大量的額外空間。 題目要求 Serialization is the process of converting a data structure or object into a sequence of bits so that...
閱讀 3458·2021-11-22 12:00
閱讀 677·2019-08-29 13:24
閱讀 2909·2019-08-29 11:31
閱讀 2595·2019-08-26 14:00
閱讀 3191·2019-08-26 11:42
閱讀 2480·2019-08-23 18:31
閱讀 803·2019-08-23 18:27
閱讀 2851·2019-08-23 16:58