重現二叉搜尋樹遞迴構建的過程

2021-07-03 20:48:03 字數 3460 閱讀 8914

二叉查詢樹(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 是指一棵空樹或者具有下列性質的二叉樹 任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 任意節點的...