1. 鏈表
1) 基本特徵:內存中不連續的節點序列,節點之間通過next指針彼此相連;
每個節點的next指針都指向下一個節點,最後一個節點的next指針爲NULL。
2) 基本操作:插入、刪除、遍歷。
3) 實現要點
追加:將新分配節點的地址賦給原鏈表最後一個節點的next指針。
插入:將前節點中存儲的後節點地址賦給新節點的next指針,將新節點的地址賦給前節點的next指針。
刪除:將前節點的next指針賦值爲待刪除節點的next指針。對於單向鏈表而言,尋找前節點會有一定開銷。
遍歷:沿着next指針依次訪問鏈表中的各個節點。
僞隨機訪問:遍歷+計數。
(1)單向鏈表
只能向後走
(2)雙向鏈表
既可以向前走,又可以向後走。
public class Node {
protected Node next; //指針域
protected int data;//數據域
public Node( int data) {
this. data = data;
}
//顯示此節點
public void display() {
System. out.print( data + " ");
}
}
package com.tyxh.link;
//單鏈表
public class LinkList {
public Node first; // 定義一個頭結點
private int pos = 0;// 節點的位置
public LinkList() {
this. first = null;
}
// 插入一個頭節點
public void addFirstNode( int data) {
Node node = new Node(data);
node. next = first;
first = node;
}
// 刪除一個頭結點,並返回頭結點
public Node deleteFirstNode() {
Node tempNode = first;
first = tempNode. next;
return tempNode;
}
// 在任意位置插入節點 在index的後面插入
public void add(int index, int data) {
Node node = new Node(data);
Node current = first;
Node previous = first;
while ( pos != index) {
previous = current;
current = current. next;
pos++;
}
node. next = current;
previous. next = node;
pos = 0;
}
// 刪除任意位置的節點
public Node deleteByPos( int index) {
Node current = first;
Node previous = first;
while ( pos != index) {
pos++;
previous = current;
current = current. next;
}
if(current == first) {
first = first. next;
} else {
pos = 0;
previous. next = current. next;
}
return current;
}
2.樹
如果單向線性鏈表裏,每個節點可以向後找到多個其他節點,這也是一個數據結構,這個數據結構叫樹
可以把樹裏的所有節點分成幾層,不同層之間有方向,這些方向都是一致的
樹最上面一層應該只有一個節點,這個節點叫做根節點
根節點可以代表整棵樹
樹裏存在直接聯繫的兩個節點之間有父子關係,靠近根節點的是父節點,遠離根節點的是子節點
任何節點最多隻能有一個父節點(根節點沒有父節點)
如果一個樹裏任何節點最多隻能有兩個子節點,這種樹叫做二叉樹
二叉樹是最簡單的樹
二叉樹裏用左右區分任何一個節點的兩個子節點
二叉樹裏任何一個節點和他下面的所有節點都可以看作的是一個新的二叉樹
節點A的左子節點代表的樹叫做節點A的左子樹,右子節點代表的樹叫做右子樹。
樹中的大多數操作都是通過遍歷來實現的,樹的遍歷大多都是通過遞歸來實現的。(問題能分解,分解後的小問題可以用該方法解決,一般採用遞歸)
在遍歷樹的時候左子樹一定在右子樹前被處理,一共有三種方式遍歷樹:
(1)最開始處理根節點的遍歷方式,叫做前序遍歷 處理節點自己的數據->處理左節點->處理右節點。
(2)中間處理根節點的遍歷方式,叫做中序遍歷 處理左節點->處理節點自己的數據->處理右節點。
(3)最後處理根節點的遍歷方式,叫做後序遍歷 處理左節點->處理右節點->處理節點自己的數據。
public class BinaryTree {
private TreeNode root=null;
public BinaryTree(){
root=new TreeNode(1,"rootNode(A)");
}
//樹的高度
public int height(){
return height(root);
}
//節點個數
public int size(){
return size(root);
}
//前序遍歷
public void preOrder(TreeNode subTree){
if(subTree!=null){
visted(subTree);
preOrder(subTree.leftChild);
preOrder(subTree.rightChild);
}
}
//中序遍歷
public void inOrder(TreeNode subTree){
if(subTree!=null){
inOrder(subTree.leftChild);
visted(subTree);
inOrder(subTree.rightChild);
}
}
//後續遍歷
public void postOrder(TreeNode subTree) {
if (subTree != null) {
postOrder(subTree.leftChild);
postOrder(subTree.rightChild);
visted(subTree);
}