二叉樹的構建以及遍歷(Java語言描述)
這篇部落格寫了二叉樹具體實現,如果沒有看過樹的基礎知識建議大家先檢視樹的基礎知識後再來看這篇文章,會更容易理解。
樹的遍歷大體分為兩類深度優先遍歷和廣度優先遍歷。而深度優先遍歷裡面又有前序中序後序遍歷,廣度優先遍歷裡面是層序遍歷。
- 二叉樹特點定義
- 每個結點最多有兩個子樹,既結點度不大於2;
- 左樹和右樹是有有順序的,位置不能顛倒;
- 即使結點只有一顆子樹,也到區別左樹還是右樹;
二叉樹儲存結構
-
順序線性儲存:
-
二叉連結串列:
二叉樹的遍歷方式
二叉樹的遍歷有前序、中序、後序遍歷。具體
二叉樹構建以及遍歷
二叉樹資料結構
- 二叉樹的節點類
class BtNode {
private BtNode leftChild=null;//設定值只是因為呼叫無參構造時用處
private BtNode rightChild=null;
private char data='a';
public BtNode() {
}
public BtNode(char data) {
this.data = data;
}
public BtNode(BtNode leftChild, BtNode rightChild, char data) {
this.leftChild = leftChild;
this.rightChild = rightChild;
this.data = data;
}
public BtNode getLeftChild() {
return leftChild;
}
public void setLeftChild(BtNode leftChild) {
this.leftChild = leftChild;
}
public BtNode getRightChild() {
return rightChild;
}
public void setRightChild(BtNode rightChild) {
this.rightChild = rightChild;
}
public char getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
}
- 二叉樹類
class BinaryTree{
BtNode root=null; //根節點
public BinaryTree() {
}
}
構建二叉樹
鍵盤輸入構建二叉樹
- 題目描述
用前序遍歷的思想來構建二叉樹。
假設我們輸入下列一串前序遍歷的序列,無子節點地方輸入#,程式為我們自動構建二叉樹,並將二叉樹前序,中序,後序輸出。
ABC##DE##F##G#H##
- 需要思考
這裡我們想要知道,構建二叉樹最好就是輸入前序遍歷序列來構建。中序和後序序列無法用來構建二叉樹。但是後面我們還可以通過任意兩個序列來構建二叉樹。
- 實現程式碼
/**
* 建立樹
*/
public void creatTreeByPreOrder(){
root=creatBtTree();
}
/**
* 根據鍵盤的輸入建立樹
* 用先序遍歷思想進行建立二叉樹
* @return nowNode
*/
private BtNode creatBtTree() {
char item;
item=new Scanner(System.in).next().charAt(0);
BtNode nowNode=null;
if (item != '#'){
nowNode=new BtNode(item);
nowNode.setLeftChild(creatBtTree());
nowNode.setRightChild(creatBtTree());
}
return nowNode;
}
public static void main(String[] args) {
BinaryTree binaryTree=new BinaryTree();
binaryTree.creatTree();
binaryTree.preOrder(binaryTree.root);
binaryTree.middleOrder(binaryTree.root);
binaryTree.pastOrder(binaryTree.root);
}
二叉樹的遍歷
前序遍歷
- 若二叉樹為空,則退出;
- 否則
- 訪問根節點
- 訪問左子樹
- 訪問右子樹
- 實現程式碼
/**
* 先序遍歷
* @param ptr
*/
public void preOrder(BtNode ptr){
if (ptr != null){
System.out.print(ptr.getData());//輸出根節點
preOrder(ptr.getLeftChild());//遞迴訪問左子樹
preOrder(ptr.getRightChild());//遞迴訪問右子樹
}
}
中序遍歷
- 若二叉樹為空,則退出;
- 否則
- 中序遍歷左子樹
- 訪問根節點
- 中序遍歷右子樹
- 實現程式碼
/**
* 中序遍歷
* @param ptr
*/
public void middleOrder(BtNode ptr){
if (ptr!=null){
middleOrder(ptr.getLeftChild());
System.out.print(ptr.getData());
middleOrder(ptr.getRightChild());
}
}
後序遍歷
- 若二叉樹為空,則退出;
- 否則
- 訪問右子樹
- 訪問左子樹
- 訪問根節點
- 實現程式碼
/**
* 後序遍歷
* @param ptr
*/
public void pastOrder(BtNode ptr){
if (ptr != null){
pastOrder(ptr.getRightChild());
pastOrder(ptr.getLeftChild());
System.out.print(ptr.getData());
}
}
相關文章
- 二叉樹遍歷 -- JAVA二叉樹Java
- 二叉樹的遍歷二叉樹
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- 二叉樹遍歷二叉樹
- 二叉樹---遍歷二叉樹
- 資料結構 二叉樹遍歷資料結構二叉樹
- 從上到下遍歷二叉樹-Java二叉樹Java
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 線索二叉樹的構造和遍歷二叉樹
- 完全二叉樹的遍歷二叉樹
- 玩轉二叉樹(樹的遍歷)二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- 二叉樹遍歷方法二叉樹
- C++樹——遍歷二叉樹C++二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 【資料結構】二叉樹的建立與遍歷資料結構二叉樹
- 二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷二叉樹
- 二叉樹的遍歷筆記二叉樹筆記
- 二叉樹的遍歷實現二叉樹
- 二叉樹的層序遍歷二叉樹
- 二叉樹的按層遍歷二叉樹
- 【LeetCode-二叉樹】二叉樹前序遍歷LeetCode二叉樹
- 二叉樹 & 二叉查詢樹 ADT [資料結構與演算法分析 c 語言描述]二叉樹資料結構演算法
- 二叉樹 & 二叉查詢樹 ADT【資料結構與演算法分析 c 語言描述】二叉樹資料結構演算法
- 迴圈遍歷二叉樹二叉樹
- 二叉樹四種遍歷二叉樹
- 6.14-二叉樹遍歷二叉樹
- 二叉樹--後序遍歷二叉樹
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- 中序線索二叉樹的構造和遍歷二叉樹
- 144. 二叉樹的前序遍歷(java實現)--LeetCode二叉樹JavaLeetCode
- 二叉樹的遍歷 (迭代法)二叉樹
- 二叉樹的遍歷及應用二叉樹
- 144. 二叉樹的前序遍歷二叉樹
- java語言實現二叉樹Java二叉樹
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 二叉樹遍歷方法總結二叉樹
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序