次優二叉樹

2021-09-06 09:59:51 字數 2502 閱讀 8398

在有序序列的查詢中,如果各個元素的查詢概率都是一樣的,那麼二分查詢是最快的查詢演算法,但是如果查詢元素的查詢概率是不一樣的,那麼用二分查詢就不一定是最快的查詢方法了,可以通過計算asl來得知。所以基於這種查詢元素概率不想等的有序序列,可以通過構造最優二叉樹的方法,使得該二叉樹的帶權路徑長度最小,這樣的二叉樹的構造代價是非常大的,所以用一種近似的演算法,構造次優查詢樹,該樹的帶權路徑長度近似達到最小。

資料結構中演算法描述為:

//初始化二叉樹

17void init_tree(treep &root)

1822

23//

建立二叉樹

24void secondoptimal(treep &rt, char r,int sw, int low, int

high)

2538

}39 rt=new

treenode;

40 rt->data=r[i]; //

生成節點

41if(i==low) //

左子樹為空

42 rt->left =null;

43else

//構造左子樹

44 secondoptimal(rt->left, r, sw, low, i-1

);45

46if(i==high) //

右子樹為空

47 rt->right =null;

48else

//構造右子樹

49 secondoptimal(rt->right, r, sw, i+1

, high);

50 }//

secondoptimal

5152

//前序遍歷二叉樹

53void

pre_order(treep rt)

5461}62

63//

中序遍歷二叉樹

64void

in_order(treep rt)

6572}73

74//

後序遍歷二叉樹

75void

post_order(treep rt)

7683}84

85//

查詢二叉樹中是否存在某元素

86int seach_tree(treep &rt,char

key)

8796

else

97103

}104

}105

106int

main()

107144 cout<

構造次優查詢樹的點累積權值sw:

"<

145for(int i=low; i)

146 cout<3)

147 cout<

148149

//建立二叉樹

150 secondoptimal(root, r, sw, low, high-1

);151

152 cout<

前序遍歷序列是:

"<

153pre_order(root);

154 cout<

155156 cout<

中序遍歷序列是:

"<

157in_order(root);

158 cout<

159160 cout<

後序遍歷序列是:

"<

161post_order(root);

162 cout<

163164

//查詢二叉樹中是否存在某元素

165 cout<

輸入要查詢的元素!

"<

166char

ch;167 cin>>ch;

168if(seach_tree(root,ch)==1

)169 cout<

yes"

<

170else

171 cout<

<

172while(1

);173

return0;

174 }

執行結果如下:

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹,完全二叉樹,滿二叉樹

二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...