樹的定義
樹是一種由邊連線著結點的資料結構,資料模型上的樹可以看做是一棵倒掛的樹木,有乙個主幹,下面是枝幹、樹葉。樹的資料結構模型如下:
節點:上圖的圓圈,比如a、b、c、d等都是表示節點,節點裡面包含了儲存的資料以及指向其它節點的位址引用。
邊:連線節點的線稱為邊,邊表示節點的關聯關係。一般從乙個節點到另乙個節點的唯一方法就是沿著一條順著有邊的道路前進,也就是引用。
樹的常用語:
二叉樹的定義
每個節點最多只有兩個子節點的書被稱為二叉樹。節點的兩個節點分別稱為:左子節點以及右子節點,滿足儲存資料規則(乙個節點的左子節點比節點小,乙個節點的右子節點比節點大)的為特殊的二叉樹–>二叉搜尋樹。二叉樹模型如下:
二叉樹的實現(二叉搜尋樹為例)
二叉樹節點類定義:
package com.lxx.tree;
/*** 二叉樹的節點類
* @author lxx
*/public class binarytreenode
// 檢視節點資料
@override
public string tostring()
}
二叉樹類定義:
package com.lxx.tree;
/*** 二叉樹實現類
* @author lxx
*/public class binarytree
//判斷是否為空
public boolean isempty()
//獲取根節點
public binarytreenode getroot()
}
插入資料
插入資料首先要找到插入的節點,根據「左子節點 < 節點 < 右子節點」 的規律查詢插入的位置,當當前節點為空時,該節點就是插入位置,同時我們應該記錄當前節點的父節點,然後將當前節點與樹關聯起來。
/**
* 新增資料
* 插入的資料會成為新的葉子節點,然後我們需要遍歷查詢具體要插入的位置,
* 以及記錄插入位置的父節點,用於利用父節點的leftchildnode或者rightchildnode將新節點關聯到書中。
*/public boolean add(int data) else
}else if(data > current.data)
}else
}return false;}}
刪除節點
//刪除資料
public boolean remove(int data)
//記錄當前節點,就是要刪除的節點
binarytreenode current = root;
//記錄當前節點的父節點
binarytreenode parent = null;
//標記刪除接單是否是父節點的左子節點
boolean isleftchild = false;
//遍歷查詢要刪除的節點current
while(current.data != data) else
if(current == null)
}if(current.leftchildnode == null && current.rightchildnode == null) else if(isleftchild) else
}else if(current.leftchildnode != null && current.rightchildnode == null) else if(isleftchild) else
}else if(current.leftchildnode == null && current.rightchildnode != null) else if(isleftchild) else
}else else if(isleftchild) else
}return true;
}//找出當前節點的替代節點
private binarytreenode getsuccessor(binarytreenode deletenode)
//後繼節點不是刪除節點的右子節點,將後繼節點替換刪除節點
if(successor != deletenode.rightchildnode)
return successor;
}
遍歷樹
二叉樹的遍歷一般有三種方式:前序遍歷,中序遍歷和後序遍歷。而二叉搜尋樹最常用的是中序遍歷(從小到大)。
前序遍歷:根節點 --> 左子樹 --> 右子樹
中序遍歷:左子樹 --> 根節點 --> 右子樹
後序遍歷:左子樹 --> 右子樹 --> 根節點
//前序遍歷
public void preorder(binarytreenode current)
}//中序遍歷
public void infixorder(binarytreenode current)
}//後序遍歷
public void postorder(binarytreenode current)
}
測試
package com.lxx.tree;
/*** 二叉樹搜尋樹測試類
* @author lxx
*/public class binarytreetest ;
//新增資料
for (int i = 0; i < array.length; i++)
//前序遍歷
system.out.print("前序遍歷");
binarytree.preorder(binarytree.getroot());
system.out.println();
//中序遍歷
system.out.print("中序遍歷");
binarytree.infixorder(binarytree.getroot());
system.out.println();
//後序遍歷
system.out.print("後序遍歷");
binarytree.postorder(binarytree.getroot());
system.out.println();
//刪除5
system.out.println("刪除5");
binarytree.remove(5);
//前序遍歷
system.out.print("前序遍歷");
binarytree.preorder(binarytree.getroot());
system.out.println();
//中序遍歷
system.out.print("中序遍歷");
binarytree.infixorder(binarytree.getroot());
system.out.println();
//後序遍歷
system.out.print("後序遍歷");
binarytree.postorder(binarytree.getroot());
system.out.println();}}
控制台輸出:
資料結構之二叉樹
在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...
資料結構之二叉樹
定義 滿足以下條件的就是樹 1.有且僅有乙個特定的稱為根root的結點。2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是乙個棵樹,並稱為根的子樹。樹是資料結構中一種常見的資料結構,比如我們排序中常見的二叉樹,紅黑樹等。最常見的是樹形表示法和廣義表表示法。樹的結構示意...
資料結構之二叉樹
來看一下樹的結構 class treenode public treenode string value 首先,為了方便後面看到效果,先手動初始化乙個有4個節點的二叉樹 tree tree new tree treenode root new treenode root treenode node1...