二叉樹本身就是遞迴定義的,所以在二叉樹上運用遞迴非常方便。下面是我刷的常見關於二叉樹的遞迴演算法的題目
leetcode 104. maximum depth of binary tree
題意:找根結點到葉子結點的最長距離(即最大深度)
演算法思路:當結點為null時,返回0,否則返回左右子樹最大距離+1。
附上**:
public int maxdepth(treenode root)
leetcode 111. minimum depth of binary tree
題意:找根結點到葉子結點的最短距離
演算法思路:當結點為null(將null看做是一棵空樹)時,返回0,然後求左節點到葉子結點的最短距離l,再求右結點到葉子結點的最短距離,求完之後不能直接返回min(l,r)+1,因為當 l == 0 && r != 0 時返回r+1,而不是0。最後返回min(r.l)+1;
附上**:
//leetcode 111. minimum depth of binary tree
public int mindepth(treenode root)
leetcode 226. invert binary tree
題意:將一顆二叉樹的左右子樹反轉
演算法思路:當樹為null時,返回null,然後分別遞迴呼叫左子樹和右子樹,實現了左右子樹反轉後,就可以反轉當前的數(左右子樹交換就可實現),最後返回當前的樹結點。
附上**:
//leetcode 226. invert binary tree
public treenode inverttree(treenode root)
leetcode 100. same tree
題意:判斷兩棵樹是否相同。
演算法思路:if 兩棵樹都為null時,返回true,else if 兩棵樹都不為空 && 其值相等 && 遞迴呼叫兩棵樹的左子樹和右子樹返回都為true,返回true,else 返回 false。
附上**:
//leetcode 100. same tree
public boolean issametree(treenode p, treenode q)
leetcode 101. symmetric tree
題意:判斷是否為對稱樹。
演算法思路:當root為空時,返回true,然後另寫乙個方法返回是否為對稱二叉樹,包含2個引數 l,r,分別為root的左右結點。不寫了,看**吧,**更清晰。
public boolean leftisright(treenode l,treenode r)
總結:遞迴函式一定要把握2點,函式出口條件和遞迴過程,理解遞迴函式呼叫就是不斷壓棧和彈棧的過程。 二叉樹的非遞迴呼叫
實現過程 首先我們知道中序遍歷就是先訪問左子樹,再根節點,最後右子樹。stl的stack容器滿足我們的先進後出的要求。1.訪問根節點的左孩子節點,看是否為null,如果存在左節點,該節點入棧如果沒有左子樹,那就訪問該節點。2.如果節點有右子樹,則重複1步驟,如果沒有右子樹 節點訪問完畢 回退,讓棧頂...
二叉樹遞迴
我們來看一下二分搜尋樹的釋放,這就是乙個典型的遞迴問題 function destroy node 這個遞迴包括兩個部分,乙個是遞迴終止條件,乙個是遞迴的執行。我們知道遞迴是不斷地將當前函式壓入函式棧,如果沒有if node null return這個終止條件,當函式棧被壓滿之後就會發生棧溢位 棧的...
遞迴二叉樹
1 基本概念 1 節點 結點包含資料和指向其它節點的指標。2 根節點 樹第乙個結點稱為根節點。3 結點的度 結點擁有的子節點個數。4 葉節點 沒有子節點的節點 度為0 5 父子節點 乙個節點father指向另乙個節點child,則child為孩子節點,father為父親節點。6 兄弟節點 具有相同父...