麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

數據結構之二叉查找樹

2019-11-14 09:58:43
字體:
來源:轉載
供稿:網友

一,今天我們來介紹下二叉查找樹,其定義是這樣子的:

(1)若左子樹不空,則左子樹上所有結點的值均小于或等于它的根結點的值;

(2)若右子樹不空,則右子樹上所有結點的值均大于或等于它的根結點的值;

(3)左、右子樹也分別為二叉排序樹;

樹的定義如下

typedef struct node

{

int         data;

struct node     *parent;

struct node     *left;

struct node     *right;

}Node;

class Tree

{

public:

Tree()

{

m_root = NULL;

}

int insertTree(int x)

{

return insert(m_root, x);

}

Node* findTree(int x)

{

return find(m_root, x);

}

int delTree(int x)

{

return delnode(m_root, x);

}

PRivate:

int insert(Node* &node, int x);

Node* find(Node* node, int x);

int delnode(Node* &node, int x);

private:

Node    *m_root;

};

二,其查找操作是這樣子的:

如果根結點的關鍵字值等于查找的關鍵字,成功。否則,若小于根結點的關鍵字值,遞歸查左子樹。若大于根結點的關鍵字值,遞歸查右子樹。若子樹為空,查找不成功,如在遞歸的過程中遇到與關鍵字值相等的節點那么查找成功。

直接上代碼嘍

Node* Tree::find(Node* node, int x)

{

if(node == NULL)

{

return NULL;

}

if(x<node->data)

{

return find(node->left, x);

}

else if(x>node->data)

{

return find(node->right, x);

}

else

{

return node;

}

}

三,其刪除操作是這樣子的

1,首先查找給定值的節點,如果找不到,那么直接失敗

2,如果查找到的節點的左右子樹均為空,并且父節點也是空,那么直接把這個節點置空就可以了。否則直接把該節點的父節點的左子節點或者右子節點置空

3,如果查找到的節點的左子樹不是空的,但是右子樹不是空的,那么把該節點的左子節點的父節點指向該節點的父節點,(1):該節點的父節點是空的,那么把該樹的根節點指向該節點的左子節點(2):該節點的父節點不是空的,

4,如果查找到的節點的右子樹不是空的,與上述操作3相反

5,如果既有左子節點,又有右子節點,那么先找到其右字數中最小的節點,把最小節點的值復給一個臨時變量,然后遞歸刪除這個最小的節點,刪完自后,把臨時變量賦值給該節點的值就可以了。

上代碼嘍:

int Tree::delnode(Node* &node, int x)

{

int temp;

Node *find_node = findTree(x);

if(!find_node)

{

return -1;

}

else if(find_node->left==NULL && find_node->right==NULL)

{

if(find_node->parent==NULL)

{

cout << "delete root" << endl;

free(find_node);

node=NULL;

}

else

{

cout << "delete root not null" << endl;

if(find_node->parent->left->data == x)

{

find_node->parent->left = NULL;

}

else

{

find_node->parent->right = NULL;

}

}

}else if(find_node->left!=NULL && find_node->right==NULL)

{

cout << "delete left not null" << endl;

find_node->left->parent = find_node->parent;

if(find_node->parent == NULL)

{

node = find_node->left;

}

else

{

find_node->parent->left = find_node->left;

}

ree(find_node);

}

else if(find_node->right!=NULL && find_node->left==NULL)

{

         cout << "delete right not null" << endl;

           find_node->right->parent = find_node->parent;

if(find_node->parent == NULL)

{

node = find_node->right;

}

else 

{

find_node->parent->right = find_node->right;

}

free(find_node);

}

else

{

               Node *p = find_node->right;

while(p->left)

{

p = p->left;

}

int min_data = p->data;

delnode(node, min_data);

find_node->data = min_data;

}

return 0;

}

四,插入操作的步驟:

1,如果根節點為空,那么直接把新的節點賦值給根節點

2,如果值比根節點小,向左遞歸,否則向右遞歸

沒什么好說的,上代碼:

int Tree::insert(Node* &node, int x)

{

if(node == NULL)

{

cout << "insert null" << endl;

Node *p = (Node *)malloc(sizeof(Node));

p->left = NULL;

p->right= NULL;

p->parent = NULL;

p->data = x;

node = p;

return 0;

}

else

{

if(node->left==NULL && x<node->data)

{

Node *p = (Node *)malloc(sizeof(Node));

p->left = NULL;

p->right= NULL;

p->parent = node;

p->data = x;

node->left = p;

return 0;

}

else if(node->right==NULL && x>node->data)

{

Node *p = (Node *)malloc(sizeof(Node));

p->left = NULL;

p->right= NULL;

p->parent = node;

p->data = x;

node->right = p;

return 0;

}

else if(x<node->data)

{

insert(node->left, x);

}

        else if(x>node->data)

{

insert(node->right, x);

}else

{

return -1;

}

}

}

歡迎掃描關注該公眾號 會定期推送一些技術文章


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 91情侣偷在线精品国产 | 人成免费a级毛片 | 斗罗破苍穹在线观看免费完整观看 | 91精品动漫在线观看 | fc2成人免费人成在线观看播放 | 日本在线播放一区二区三区 | 91av国产在线| 在线成人免费观看视频 | 国产精品视频六区 | 中国av免费在线观看 | 久久精品视频首页 | 91成人久久 | 欧美一级特黄aaaaaa在线看首页 | 成人毛片av在线 | 国产视频在线观看一区二区三区 | 免费毛片电影 | 日本网站一区二区三区 | 爽爽视频免费看 | 国产美女一区二区在线观看 | 人人舔人人舔 | 久久久免费电影 | 国产三级a三级三级 | 久久美女免费视频 | 亚洲一区二区三区高清 | 欧美国产一区二区三区激情无套 | 欧美日韩一区三区 | 吾色视频 | h视频在线免费看 | a级高清免费毛片av在线 | 久久毛片免费观看 | 精品乱码久久久久 | 国产免费成人在线 | 中文字幕免费在线观看视频 | 国产午夜免费不卡精品理论片 | 日日狠狠久久偷偷四色综合免费 | 亚洲一区二区中文字幕在线观看 | 国产手机av在线 | 欧美精品一区二区视频 | 国产免费人做人爱午夜视频 | 久久精品国产亚洲7777 | 在线亚洲免费视频 |