(JAVA)二叉樹的補空法建立與前中後遍歷 層序遍歷
阿新 • • 發佈:2021-02-08
二叉樹的建立(補空法)
(按先序建立,先根再左再右)
這裡就不過多介紹了,附上詳細程式碼
2,先中後序在前面的部落格中已經介紹過,這裡主要介紹層序遍歷。
(1)層序遍歷是先遍歷第一層,再第二層,再第三層。。。同一層按從左往右的順序依次遍歷。
(2)不難發現,先被訪問的節點,其孩子也先被訪問,所以我們可以用到佇列,當該節點被訪問時,把其孩子入隊。
(3)我用圖詳細介紹一下
比如該樹
①首先建立一個佇列q,令樹根入隊。如圖所示。注意,實際上是指向樹根a的指標入隊。
②隊頭元素出隊,輸出A,同時令A的孩子bc入隊,從左向右順序,如果是普通樹,則包含所有孩子。佇列和二叉樹狀態,如左圖和右圖所示。
③隊頭元素出隊,輸出B,同時令B的孩子de入隊,佇列和二叉樹的狀態如圖所示
④隊頭元素出隊,輸出C。同時令c的孩子f入隊。佇列和二叉樹狀態如圖所示。
⑤最後直到佇列為空演算法結束。
詳細程式碼如下
package Tree;
import java.util.LinkedList;
import java.util.Scanner;
public class bianli {
public static class BNode{
String data;
BNode lchild,rchild;
}
public static BNode creattree(BNode t){
String ch;
Scanner scanner=new Scanner(System.in);
ch=scanner.nextLine();
if(ch.equals("#")){
t=null;
}
else{
t=new BNode();
t.data=ch;
t.lchild=creattree(t.lchild);
t. rchild=creattree(t.rchild);
}
return t;
}
static void preorder(BNode t){
if(t!=null){
System.out.print(t.data+" ");
preorder(t.lchild);
preorder(t.rchild);
}
}
static void inorder(BNode t){
if(t!=null){
inorder(t.lchild);
System.out.print(t.data+" ");
inorder(t.rchild);
}
}
static void postorder(BNode t){
if(t!=null){
postorder(t.lchild);
postorder(t.rchild);
System.out.print(t.data+" ");
}
}
static boolean levelorder(BNode t){
if(t==null){
return false;
}
BNode p;
LinkedList<BNode> queue=new LinkedList<>();
queue.push(t);
while (!queue.isEmpty()){
p=queue.pop();
System.out.println(p.data);
if(p.lchild!=null){
queue.add(p.lchild);
}
if(p.rchild!=null){
queue.add(p.rchild);
}
}
return true;
}
public static void main(String[] args){
System.out.println("按先序輸入二叉樹中節點的值(孩子為空時輸入#)");
BNode node=new BNode();
node=creattree(node);
System.out.println("先序");
preorder(node);
System.out.println();
System.out.println("中序");
inorder(node);
System.out.println();
System.out.println("後序");
postorder(node);
System.out.println();
System.out.println("層序");
levelorder(node);
}
}