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的所在子樹...