給定乙個插入序列就可以唯一確定乙個平衡二叉樹,但是,乙個給定的平衡二叉樹卻可以由不同的插入序列得到。
比如按照序列{2,1,3}
與序列{2,3,1}
插入初始為空的二叉搜尋樹中,將得到相同的二叉平衡樹。強調內容
有一下三種方式:
1.建立搜尋樹
根據兩個序列分別建立兩個搜尋樹,在去比較兩個樹是否一樣。
2.不建立搜尋樹
首先比較序列的第乙個元素是否相同,如果不相同,則說明兩個序列對應的一定不是同乙個樹,如果相同,說明兩個序列的根元素是相同的。然後可以把後邊的元素分成兩堆(比第乙個元素小的,比第乙個元素大的),分類的時候元素的順序是不能改變的。
比如序列1{3,1,2,4}
與序列2{3,4,1,2}
首先判斷第乙個元素是相等的,則把後邊的元素分類。序列1變為,序列2變為
,比較可得兩個序列對應的是同乙個二叉搜尋樹。
又如與
這兩個序列,經過變化之後為
,
可以得到前兩個的元素順序是不相同的,所以這兩個序列對應的搜尋樹是不相同的。
3.建立乙個樹,在判斷其他序列是否與該樹相同。
3.1 搜尋樹表示方法
typedef
struct treenode *tree;
struct treenode
;
v表示的是在結構體中儲存的資料,型別為elementtype,left,right表示的是左右孩子節點的位址。flag是作為乙個節點的標記,預設為0。
3.2 建立搜尋樹
首先需要讀入序列的長度n,與需要判斷序列的個數l。然後根據n個元素去建立搜尋樹t。最後依據樹t去判斷後邊的l個序列是否能與樹t形成同乙個搜尋樹。
需要設計的主要函式有:
void main()
freetree(t);//釋放樹
scanf("%d",&n);//繼續下一批序列的比較}}
3.3判斷乙個序列是否與搜尋樹相同當乙個樹t建立之後,如何判斷乙個序列對應的搜尋樹是否跟t相同呢?
方法: 在樹t中按順序搜尋序列中的的每個數。
對應的函式實現:
int check(tree t,int v)
else
else // 在標記是0 的條件下,數值也不相同,導致在序列構建樹的時候,該節點會不一致。
return
0; }
}
judge(tree t ,int n)
函式的具體實現:
int judge(tree t,int n)//有bug
else
return
1;}
然後在這種情況下,judge函式會有乙個bug出現,當乙個序列還沒有輸入完全的時候,出現了不一致,導致了後邊的數值無法輸入。所以在judge函式中引入乙個標記,確保在不一致的時候,也可以把後邊的序列輸入完全。更改如下:
int judge(tree t,int n)
if(flag)
return
return
0; return
1;}
全部**:#include
#include
typedef struct treenode *tree;
struct treenode
void main()
freetree(t);
scanf("%d",&n);
} }int judge(tree t,int n)//當發現出現不一致的時候,也要把後邊的資料輸入完,不能直接返回。所以新增了flag標記。
if(flag) return
0; else
return1;}
int check(tree t,int v)
else
else
return
0; }
}//建立二叉樹
tree maketree(int n)//n表示的是這顆樹有多少個節點
return
t; }
//插入節點函式
tree insert(tree t,int v)
else
t->right = insert(t,v);
}return
t;}
//建立二叉樹的每乙個節點
tree newnode(int v)
//清楚標記
void reset(tree t)
//釋放記憶體空間
void freetree(tree t)
二叉搜尋樹 (判斷是否為同一顆搜尋樹)
判斷兩序列是否為同一二叉搜尋樹序列 開始乙個數n,1 n 20 表示有n個需要判斷,n 0 的時候輸入結束。接下去一行是乙個序列,序列長度小於10,包含 0 9 的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。接下去的n行有n個序列,每個序列格式跟第乙個序列一樣,請判斷這兩個序列是否能組...
判斷一顆二叉樹是是否是另一顆樹的子樹。
什麼樣的情況下,某一棵樹會成為另一棵樹的子數呢?子樹的根節點是某一棵樹的某個節點,接下來的子節點也相同,則該樹是另一棵樹的子集。首先找到與根節點相同的節點,在進行遍歷,可使用遞迴法。template struct treenode template bool check treenode root1...
判斷一顆樹是否是平衡二叉樹
判斷一顆樹是否是平衡二叉樹 首先需要搞清楚什麼是平衡二叉樹。平衡二叉樹是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。定義乙個類先建立出結果是否是平衡的和高度為多少?public static class returnnode 主方法 public stat...