二叉樹的相關操作,主要包括建立、判空、刪除子樹、刪除節點、各種遍歷演算法等(包括先根遍歷、中根遍歷、後根遍歷、層次遍歷等)。本章重點說明四種遍歷演算法與刪除節點操作的實現。以如下二叉樹為例:
1、先根遍歷:先訪問根節點,然後是左節點,然後是右節點,遞迴直至訪問結束;上述二叉樹先根遍歷順序為abdgcefh
2、中根遍歷:先訪問左節點,然後根節點,然後右節點,遞迴訪問至結束;上述二叉樹中根遍歷順序為g d b a e c f h
3、後根遍歷:先訪問左節點,然後右節點,然後根節點,遞迴訪問至結束;上述二叉樹後根遍歷順序為g d b e h f c a
4、層次遍歷:從根節點開始,從左往右遍歷,一層遍歷完,再前往下一層繼續遍歷,直至結束。上述二叉樹後根遍歷順序為 a b c d e f g h
5、二叉樹節點刪除:二叉樹節點的刪除在普通二叉樹中的意義不大,但是在二叉排序樹(也叫做二叉查詢樹)中的應用卻十分重要。具體分析在二叉樹節點刪除的方法中會詳細說明。
下面貼**:
package erchashu;
public class binarytree
//建立一顆樹
public void createtree()
//判斷是否是空樹
public boolean isempty()
//計算樹的高度
public int treeheight()
public int height(treenode root) }
//計算節點個數
public int treenodeindex()
public int size(treenode root) }
//返回父母節點
public treenode parentnode(treenode root,treenode trnode)
}return node;
} //刪除子樹,需確定刪除的子樹是其父節點的左子樹還是右子樹
public void deletenodetree(treenode trnode)
treenode temp=parentnode(root,trnode);
if(temp.lchild==trnode)
temp.lchild=null;
if(temp.rchild==trnode)
temp.rchild=null;
if(trnode!=null)
}/* * 刪除節點
* *
* 關於刪除節點,這裡有一點要特別說明,刪除操作一般是應用於二叉查詢樹,涉及到排序的問題,所以在刪除的時候要考慮到排序不能亂,
* 所以關於二叉樹 的刪除較為複雜一些。即我們刪除後的二叉樹依舊是二叉排序樹。
* 這裡我們不多做考慮,主要是為了闡述刪除節點的演算法,如果覺得這裡寫的不清楚,可以檢視我後面寫的關於二叉查詢樹的部落格,二叉查詢樹也叫二叉排序樹
* *
* 刪除節點依據要刪除節點位置分為三種情況來討論
* 1.刪除節點為葉子節點,則直接刪除
* 2.刪除節點不是葉子節點,且該節點僅有乙個孩子節點,則將該節點刪除,該節點的孩子節點直接放置於刪除節點位置
* 3.刪除節點不是葉子節點,且該節點有兩個孩子節點,此時按照中序排列取該節點的前驅或者後驅置於該節點位置並刪除前驅或者後驅節點
* 我們選擇的前驅或者後驅節點必然是沒有左孩子或者右孩子的節點,或者是葉子節點
*/public void deletenode(treenode trnode)
treenode tnee=parentnode(root,trnode);
//要刪除的節點為葉子結點,先確定該節點是其父母節點的左節點還是右節點
if(trnode.lchild==null&&trnode.rchild==null)
if(tnee.lchild==trnode)
tnee.lchild=null;
if(tnee.rchild==trnode)
tnee.rchild=null;
return;
} if(trnode.lchild!=null&&trnode.rchild==null)
if(tnee.lchild==trnode)
tnee.lchild=trnode.lchild;
if(tnee.rchild==trnode)
tnee.rchild=trnode.lchild;
return;
} if(trnode.lchild==null&&trnode.rchild!=null)
if(tnee.lchild==trnode)
tnee.lchild=trnode.rchild;
if(tnee.rchild==trnode)
tnee.rchild=trnode.rchild;
return;
} if(trnode.lchild!=null&&trnode.rchild!=null)
//我們這裡採用該節點處中根遍歷的後驅節點
treenode temp=trnode.rchild;
while(temp.lchild!=null)
temp=temp.lchild;
if(tnee.lchild==trnode)
if(tnee.rchild==trnode)
return;
} } //先根遍歷
public void preorder(treenode trnode) }
//中根遍歷
public void inorder(treenode trnode) }
//後根遍歷
public void postorder(treenode trnode) }
//層次遍歷,層次遍歷這裡使用了佇列.佇列使用的型別是帶頭結點的單迴圈鍊錶
public void levelorder(treenode trnode) }
public void visit(treenode trnode)
//測試
public static void main(string args)
}
package erchashu;
public class treenode
}
package erchashu;
public class queue
//入隊
public void enqueue(treenode node)
//出隊
public treenode dequeue()
}
二叉樹 二叉樹的相關操作
遞迴實現 建立求樹高 求葉子數 求節點數 統計度為2的結點個數 後序輸出 先序輸出 中序輸出 交換左右子樹 include include include define true 1 define false 0 define ok 1 define error 0 define overflow ...
Java實現二叉樹的相關操作
求二叉樹的深度 public static intbitreedepth bitnode t return depthval 求data所對應結點的層數,如果物件不在樹中,結果返回 1 否則結果返回該物件在樹中所處的層次,規定根節點為第一層 public static intlevel bitnod...
二叉樹相關操作
include using namespace std typedef struct btnode btnode btnode newnode int value 非遞迴 btnode nodesearch btnode root,btnode parent,int value 遞迴 btnode ...