二叉搜尋樹里比較複雜的就是刪除節點的操作,原理網上有很多說得很細,其中我綜合借鑑了幾個博主的刪除操作,才終於整明白了。
test.h
#include
#include
using
namespace std;
struct node ;}
;class
tree
;
test.cpp
#include
"stdafx.h"
#include
"test.h"
tree::
tree()
tree::
tree
(vector<
int> a)
}tree::
~tree()
void tree::
inorder()
void tree::
preorder()
void tree::
postorder()
int tree::
minval()
return cur-
>val;
}int tree::
maxval()
return cur-
>val;
}void tree::
remove
(int x)
void tree::
destroy()
bool tree::
isempty()
return
false;}
void tree::
destroy
(node*
&root)
if(root-
>right)
delete
(root)
; root =
null
;return;}
void tree::
remove
(node*
&t,int x)
else
if(x > t-
>val)
elseif(
!t->left ||
!t->right)
else
t->val = cur-
>val;
remove
(t->right, cur-
>val);}
}}void tree::
push
(int x)
node* cur = root;
node* pre =
null
;while
(cur !=
null
)else}if
(pre-
>val > x)
else
return;}
void tree::
inorder
(node* cur)
inorder
(cur-
>left)
; cout << cur-
>val <<
"->"
;inorder
(cur-
>right)
;return;}
void tree::
preorder
(node * cur)
void tree::
postorder
(node * cur)
node * tree::
search
(int x)
else}if
(cur ==
null
)cout <<
"no such value in the tree."
<< endl;
return cur;
}
測試的主函式
#include
"stdafx.h"
#include
"test.h"
intmain()
; tree a
(c);
a.inorder()
; a.
postorder()
; a.
preorder()
;for
(auto i : c)
a.inorder()
; a.
remove(3
);a.inorder()
; vector<
int> t1 =
; tree b1
(t1)
; b1.
inorder()
; b1.
remove(20
);b1.
inorder()
; b1.
push(-
1); b1.
inorder()
; b1.
destroy()
; b1.
isempty()
;system
("pause");
return0;
}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...
二叉搜尋樹c 二叉搜尋樹的遍歷
可以總結出三條性質 1 非空左子樹的所有鍵值小於根節點的鍵值。2 非空右子樹的所有鍵值大於根節點的鍵值。3 左右子樹都是二叉搜尋樹。他的遍歷有三種形式 先序遍歷 中序遍歷 後序遍歷。1 先序遍歷 根節點 左子樹 右子樹 首先訪問根節點,然後遍歷左子樹,最後右子樹。並且自遍歷左右子樹時,仍然先訪問根節...
C 二叉搜尋樹
二叉搜尋樹.include using namespace std template type class bstnode templatetype class bsttree return in bsttree vef 1 root null bsttree const bsttree bst b...