資料結構演算法基礎 之 二叉樹

2021-10-01 03:06:03 字數 3107 閱讀 7994

/**

* 樹節點

*/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 個互不相交的有限集,其中每個集合本身又是乙個棵樹,並稱為根的子樹。樹是資料結構中一種常見的資料結構,比如我們排序中常見的二叉樹,紅黑樹等。最常見的是樹形表示法和廣義表表示法。樹的結構示意...