二叉樹各種練習

2021-08-09 13:04:30 字數 1974 閱讀 7865

public class binarytree 

}

題目沒有任何背景,只是方便生成二叉樹,用來做試驗。備註:所有方法都是在乙個類中的,所以裡面的root是全域性變數。

public void convert(int nums) 

if(top>0)

}while(top>0||s!=null);

return result;

}

備註:因為沒有使用內建的棧,所以上面的**中,使用了stack模擬棧的使用。(有點low了)~~~~

遞迴版:

public void orderdlr(node s) 

}

二叉樹的後序遍歷順序是ldr,即當前根節點的左孩子,然後根節點,然後當前節點的右孩子。

舉例來說:

先切換到1,再切換到2,再切換到4,因為4沒有左孩子,所以訪問4,因為4沒有右孩子,所以訪問2,切換到5,因為5沒有左孩子,訪問5,

因為5沒有右孩子,訪問1,切換到3,因為3沒有左孩子,訪問3,因為3沒有右孩子,訪問結束。所以最終的中序遍歷順序是:4 2 5 1 3

中序遍歷的**也分為遞迴和非遞迴。

非遞迴:

public listorderldr() 

if(top>0)

}while(top>0||s!=null);

return result;

}

備註:之所以不需要傳入待遍歷二叉樹的根節點,是因為,裡面**中的root是全域性變數,所以直接例項化二叉樹類的時候可以直接使用,類似於 棧的 stack.size() 用法;

當然可以對**進行改動。

遞迴:

public void orderldr(node s) 	

}

備註:與先序相比,這兩段**的不同只是訪問語句的順序不同而已,後面的後序遍歷的遞迴**也是如此。

二叉樹的後序遍歷,訪問順序為:lrd。直接舉例說明:

切換到1,切換到1的左孩子2,切換到2的左孩子4,因為4沒有左孩子,也沒有右孩子,訪問4,切換到2的右孩子5,因為5沒有左孩子,沒有右孩子,訪問5,訪問2,切換

到1的右孩子3,因為3沒有左孩子也沒有右孩子,訪問3,訪問1,訪問到根節點,結束。最後的後序遍歷順序為:4 5 2 3 1.

非遞迴版:

public void orderlrd() else 

if(p.lchild!=null)

}} }

備註:後序遍歷的非遞迴相對比較難,需要引入乙個指標來記憶上一次訪問的節點。可以訪問的節點情況是:1、當前節點的左孩子,右孩子均不存在。

2、當前節點的左孩子不存在,上一次訪問的是當前節點的

右孩子。

3、上一次訪問的是當前節點的右孩子。

遞迴:

public void orderlrd(node s) 		

}

備註:實際上,二叉樹深度優先遍歷的遞迴迭代**,對於先序、中序、後序來說,其切換順序都是一樣的,只是具體訪問順序不一樣而已。

廣度優先遍歷是指逐層遍歷,即從根節點開始,一層一層的遍歷。用到了佇列的方法。

public void levelorder()

int midnum=root1.data;

int i=0;

while(midnum!=mid[i])i++;

if(i>0) {

int prec=new int[i];

int midc=new int[i];

for(int j=0;j0) {

int prec=new int[plen-i-1];

int midc=new int[plen-i-1];

for(int j=i+1;j

二叉樹練習

題目 給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。示例 1 輸入 tree 1 tree 2 1 2 ...

二叉樹練習

pragma once include include include include typedef int btdatatype typedef struct btnodebtnode btnode buynode btdatatype val pnewnode left null pnewno...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...