二叉查詢樹(binary search tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。
簡單而言就是
左邊的小於中間
中間的小於右邊
首先建立幾個資料變數
#define type int
struct treenode;
typedef struct treenode* bst;
struct treenode
;
對於這種樹,我們假設這棵樹已經建好
如何找到節點的資料,即搜尋資料,並將節點指標返回
樹的最本質的一種方法就是遞迴,對歸只要拿出一種情況觀察就可以
如下
偽**為
bst find(data,bst t)
這種find的搜尋思想貫穿搜尋樹的操作
下面看看 怎麼去建立一顆bst
比如對一串數
1 3 2 8 9 4 1
在建樹的同時也是在排序的過程
首先有一顆樹,然後將這些數字放進去
第一步就是建一顆小樹
那麼就以第乙個數1為資料,下面是偽**
bst t=malloc();
t-data=1;
t->left =null;
t->right =null;
第二步就是將數插入這個小樹中
基本思想還是
比節點小的往左子樹插
比節點大的往右子樹插
首先函式的引數 肯定有x(要插入的數),二叉查詢樹的root指標 bst t
insert(bst t,x)
那麼分這幾種情況討論
往這顆樹t要插入6,insert(6,t);
先比較節點資料5,發現大於5,則6要往右子樹裡面插
遞迴呼叫
insert(6,t->right)
此時6就應該插入在這裡
而在這裡的結束的條件是,傳進來的樹指標是null
所以
偽**
if(t == null)
但是這時候有個問題
即我們在堆中開闢了新的空間,是需要將這個空間指標以鍊錶形式連線到節點5上的,所以必然要返回乙個樹指標
所以 insert重新修改為
bst insert(x,bst t)
上面的偽**也要將t返回
bst insert(x,bst t)
return
t;}
基本呼叫為
要往上面這顆樹中插入8
同樣是比較,情況1是這個遞迴結束的條件
那麼用else分支進行遞迴
偽**框架為
bst insert(x,bst t)
else
else
if(t->data t->right=insert(x,t->right);
} }return
t;}
所以二叉搜尋樹的插入也就完成了
為此完成一道題目
輸入:
開始乙個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。
接下去一行是乙個序列,序列長度小於10,包含(0~9)的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。
接下去的n行有n個序列,每個序列格式跟第乙個序列一樣,請判斷這兩個序列是否能組成同一顆二叉搜尋樹。
輸出:
如果序列相同則輸出yes,否則輸出no
樣例輸入:
2 567432
543267
576342
0 樣例輸出:
yes
no基本思路就是 將這三棵樹構建起來,
然後重新前序遍歷,相同則是同一棵樹
**
#include
#include
#include
using namespace std;
#define type int
struct treenode;
typedef struct treenode* searchtree;
typedef struct treenode* position;
struct treenode;/*
searchtree
makeempty(searchtree t)
return
null;
}position
find(type x,searchtree t)
position
findmin(searchtree t)
position
findmax(searchtree t)
*/searchtree
insert(type x,searchtree t)
else
if(x < t->data)
t->left = insert(x,t->left);
else
if(x > t->data)
t->right = insert(x,t->right);
returnt;}
void dlr(searchtree t,string& s)
}int main()
; int a=;
int c=;
string sb;
string sa;
string sc;
searchtree tb=null;
searchtree ta=null;
searchtree tc=null;
for(int i=0;i<6;++i)
dlr(tb,sb);
dlr(ta,sa);
dlr(tc,sc);
if(sb==sa)
cout<
cout<
cout<
cout<
0;}
二叉樹構建 遞迴
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 限制 0 節點個數 5000 本次使用遞迴思路 二叉樹的構...
二叉搜尋樹(遞迴 非遞迴)
完整源 在此 1 二叉搜尋樹的概念 二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹。若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值 若它的右子樹不為空,則右子樹上所有的節點的值都大於根節點的值 它的左右子樹也分為二叉搜尋樹 此二叉樹的中序遍歷結果為 0,1,2,3...
二叉搜尋樹 非遞迴)
二叉查詢樹 英語 binary search tree 也稱二叉搜尋樹 有序二叉樹 英語 ordered binary tree 排序二叉樹 英語 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 任意節點的...