/**
* 二叉查詢樹
* 和二分查詢一樣,插入和查詢的時間複雜度均為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 ...