/**
* 樹節點
*/public class node
public int getnum()
public node getleft()
public node getright()
public void setnum(int num)
public void setleft(node left)
public void setright(node right)
}
/**
* 二叉搜尋樹
*/public class treenode implements tree
public node getroot()
@override
/*** 插入操作
*/public boolean insert(int num)
node curnode = root;
node prenode = root; // 記錄前乙個節點
while(curnode != null)else if(curnode.getnum() < num)
}// 迴圈結束, prenode則為要插入節點的父節點
if(prenode.getnum() > num)else if(prenode.getnum() < num)
return true;
}@override
/*** 刪除操作
* 三種情況: 1. 刪除沒有子節點的節點
* 2. 刪除有乙個子節點的節點
* 3. 刪除有兩個子節點的節點
*/public boolean delete(int num)
node curnode = root;
node prenode = root;
boolean isleft = true;
// 尋找要刪除的節點
while(curnode.getnum() != num)else if(curnode.getnum() < num)
if(curnode == null)
}// 刪除節點無子節點
if(curnode.getleft() == null && curnode.getright() == null)else if(isleft)else
return true;
}if(curnode.getleft() != null && curnode.getright() == null)else if(isleft)else
return true;
}else if(curnode.getleft() == null && curnode.getright() != null)else if(isleft)else
return true;
}else else if(isleft)else
successor.setleft(curnode.getleft());
return true;}}
public node getsuccess(node delnode)
// 後繼節點不是刪除節點的右子節點,將後繼節點替換刪除節點
if(successor != delnode.getright())
return successor;
}@override
/*** 查詢操作
*/public node find(int num) else if(curnode.getnum() < num)else
}// 遍歷後沒有找到則返回null
return null;
}/**
* 刪除操作 改
* @param
* @return
*/public boolean delete2(int num)
// 如果沒有找到
if(curnode == null) return false;
// 要刪除節點有兩個子節點
if(curnode.getleft() != null && curnode.getright() != null)
curnode.setnum(curtemp.getnum());
curnode = curtemp;
prenode = pretemp;
}// 刪除節點是葉子節點
node child; // p的子節點
if(curnode.getleft() != null) child = curnode.getleft();
else if(curnode.getright() != null) child = curnode.getright();
else child = null;
if(prenode == null) root = child; // 刪除的是根節點
else if(prenode.getleft() == curnode) prenode.setleft(child); // 刪除節點為其父節 點的左子節點
else prenode.setright(child); // 刪除節點為其父節點的右子節點
return true;
}@override
/*** 中序遍歷(從小到大): 左子節點-->當前節點-->右子節點 o(n)
*/public void inorder(node node)
inorder(node.getleft());
system.out.print(node.getnum()+" ");
inorder(node.getright());
}/**
* 最大值
*/public node findmax()
return prenode;
}/**
* 最小值
*/public node findmin()
node curnode = root;
node prenode = root;
while(curnode != null)
return prenode;
}}
資料結構之二叉樹基礎二
include include include include include using namespace std struct btnode typedef struct btnode int depth btnode root int n1 depth root lc int n2 dept...
資料結構之二叉樹
在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...
資料結構之二叉樹
定義 滿足以下條件的就是樹 1.有且僅有乙個特定的稱為根root的結點。2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是乙個棵樹,並稱為根的子樹。樹是資料結構中一種常見的資料結構,比如我們排序中常見的二叉樹,紅黑樹等。最常見的是樹形表示法和廣義表表示法。樹的結構示意...