二叉排序樹的查詢,插入,刪除操作

2021-10-05 13:57:35 字數 1760 閱讀 1822

/**

* 二叉查詢樹

* 和二分查詢一樣,插入和查詢的時間複雜度均為o(logn),但是在最壞的情況下仍然會有o(n)的時間複雜度

*/#include "tree.h"

#include using namespace std;

typedef struct bitnodebitnode;
//遞迴插入

bitnode *recursiveinsertbstree(bitnode *root, int val)

if (val < root->data) else

return root;

}/** 非遞迴插入

* 先挨個比較找到要插入的位置

* 確定是根還是左孩子還是右孩子

*/bitnode *insertbstree(bitnode *root, int val) else

}if (root == null) else if (val < parent->data) else

return root;

}//非遞迴查詢 小於遍歷左子樹否則遍歷右子樹

bitnode *searchbstree(bitnode *root, int val)

bitnode *p = root;

while (p != null)

if (val < p->data) else

}return null;

}//遞迴查詢

bitnode *recursivesearchbstree(bitnode *root, int val)

if (root->data == val)

if (val < root->data) else

}//刪除

/**刪除的節點分為三類:

* 度為0的節點: 區分根和葉子節點直接刪除

* 度為1的節點

* 度為2的節點

* 先遍歷比較找到要刪除的節點並記錄該節點的父節點

*/bool deletebstree(bitnode *root, int val)

bitnode *p = root;

bitnode *parent = null;

bool find = false;

while (p != null && !find) else if (val < p->data) else

}if (p == null)

if (p->lchild == null && p->rchild == null) else if (parent->lchild == p) else

free(p);

return true;

}if (p->lchild == null || p->rchild == null) else

} else if (p->lchild != null) else

} else else

}free(p);

return true;

}bitnode *s = p->lchild;//度為2的節點

bitnode *sp = p;

while (s->rchild != null)

p->data = s->data;

if (sp == p) else

free(s);

return true;

}

二叉排序樹 插入 刪除 查詢

原本是想寫關於android分享功能的部落格,但是沒真機不好去測試,大白天的手機被3歲娃娃,拿去看少兒頻道了,關於二叉排序樹的定義是 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的...

二叉查詢樹(二叉排序樹)建立,插入,刪除操作。

尋找節點就是直接依據數值的大小。從root節點開始遍歷,大於當前遍歷節點就向它的右子樹查詢,相反則查詢它的左子樹。然後返回。直接依據root節點,遍歷到最右就是最大節點,遍歷到最左,就是最小節點。插入節點我這裡插入的節點都會成為葉子節點。依據大小的關係向下遍歷,遍歷到最後的節點,然後插入就能夠了。這...

二叉排序樹的查詢 插入 刪除

二叉排序樹的查詢 插入 刪除 何謂二叉排序樹 定義 二叉排序樹又稱二叉查詢樹,它或者是一顆空樹,或者是具有以下性質的二叉樹 1 若它的左子樹不空,則左子樹上所有節點的值均小於該節點的值。2 若它的右子樹不空,則右字樹上所有節點的值均大於該節點的值。3 它的左右子樹也分別為二叉排序樹。時間複雜度 o ...