一、建立(插入):遞迴
struct
node
node
(int x)
:val
(x),
left
(null),
right
(null)}
;node*
insert
(int x,node* pnode)
else
else
return pnode;}}
void
inorder
(node*
& root)
inorder
(root->left)
; cout << root->val <<
' ';
//訪問根節點
inorder
(root->right);}
intmain()
; node* pnode =
newnode
(a[0])
;//以第乙個元素為根節點
// 每次插入都從根節點開始判斷
for(
int i =
1; i < n;
++i)
inorder
(pnode);}
//在遞迴插入時,要實現每插入乙個節點就輸出該節點的雙親節點,可在insert()函式中新增乙個引數,用於記錄輸出雙親節點的值,
//在遞迴結束時(即找到插入位置進行插入時)輸出。 另外,若要實現從空樹開始插入,即不需單獨先建立乙個根節點,insert()函式
//的node*引數可設為引用,初始時傳入乙個為null的根節點指標。
node*
insert
(int x, node*
& pnode,
int parent)
else
else
}return pnode;
}int
main()
//node* pnode = new node(a[0]);
node* pnode =
null
;for
(int i =
0; i < n;
++i)
inorder
(pnode)
;//pnode為根節點
}
非遞迴
struct
node
node
(int x)
:val
(x),
left
(null),
right
(null)}
;int
main()
node* pnode =
newnode
(a[0])
;//cout << -1 << endl;
for(
int i =
1; i < n;
++i)
else
}else
else}}
}}
二、查詢
//遞迴 僅實現查詢
node*
search
(int x,node* root)
if(root->val > x)
else
}
//非遞迴
node*
search
(int x,node* root)
if(x < root->val && root->left!=
null
)else
if(x > root->val && root->right !=
null)}
return
null
;}
三、在查詢不成功時插入
//查詢成功則返回查詢節點,不成功則返回查詢路徑上的最後乙個節點f,以便進行插入.f初始呼叫值為null
node*
search
(node* root,
int x,node* f,
bool
& found)
else
if(x == root->val)
else
if(root->val > x)
else
}void
insert
(node* f, node* root,
int x)
else
if(x < f->val)
else
}
二叉查詢樹(二叉排序樹)建立,插入,刪除操作。
尋找節點就是直接依據數值的大小。從root節點開始遍歷,大於當前遍歷節點就向它的右子樹查詢,相反則查詢它的左子樹。然後返回。直接依據root節點,遍歷到最右就是最大節點,遍歷到最左,就是最小節點。插入節點我這裡插入的節點都會成為葉子節點。依據大小的關係向下遍歷,遍歷到最後的節點,然後插入就能夠了。這...
二叉排序樹的查詢 插入與刪除
二 二叉排序樹結點的刪除 二叉排序樹的結點刪除要比二叉排序樹結點的插入要複雜一些,不過也並不難,要分為幾種情況進行討論。二叉排序樹結點的插入與刪除都是在查詢的基礎上來做的。下方我們就假設找到了我們要刪除的結點,根據結點含有的左右結點的個數來進行分類討論。下方會對這幾種情況進行討論。1.刪除結點的幾種...
二叉排序樹 插入 刪除 查詢
原本是想寫關於android分享功能的部落格,但是沒真機不好去測試,大白天的手機被3歲娃娃,拿去看少兒頻道了,關於二叉排序樹的定義是 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的...