二叉搜尋樹

2021-06-28 05:08:02 字數 2383 閱讀 3168

二叉搜尋樹是紅黑樹的基礎。

原始碼:

#ifndef binary_tree_h

#define binary_tree_h

#include "common.h"

typedef struct binsrchnodebsnode,*bstree;

#endif

bsnode* treeinsert(bsnode* root,bsnode* node);

bsnode* newnode(bsnode* node);

bsnode* iterativetreesearch(bsnode* x,int k);

bsnode* treemaxmum(bsnode* x);

bsnode* treeminmum(bsnode* x);

bsnode* treesuccesor(bsnode* x);

bsnode* treedelete(bsnode* root,bsnode* todel);

void searchtree();

void searchtree()

; node.key = 10;

root = treeinsert(root,&node);

// 10

// / \

// / \

// 5 15

// / \ / \

//2 8 12 16

// / / \ / \

// 1 6 9 11 13

// / \

// 10 14

for(i=0; ikey);//&& tmp->key != 5

if (tmp->key == 12)

root = treedelete(root,tmp);

printf("=---=");

for(j=0; j<20; j++)

}} } }

bsnode* treeinsert(bsnode* root,bsnode* node)

else

}node->p = predecesor;

tmp = newnode(node);

if(predecesor == null) //如果是空樹

else if(node->key < predecesor->key)

else

return root;

}bsnode* newnode(bsnode* node)

bsnode* iterativetreesearch(bsnode* x,int k)

else

}return x;

}bsnode* treeminmum(bsnode* x)

return x;

}bsnode* treemaxmum(bsnode* x)

return x;

}bsnode* treesuccesor(bsnode* x)

//如果沒有右孩子,則其後繼在下乙個被中序遍歷的結點上。

//while迴圈用來尋找下乙個被遍歷的結點。

//迴圈條件:沒有到達根節點或子是父的右孩子。

//迴圈截止條件為到達根節點或者到了子樹是父結點的左分支結點

p = x->p;

while(p != null && x == p->right)

return p;

}static bsnode* transplant(bsnode* root, bsnode* oldnode,bsnode* newnode)

else if(oldnode == oldnode->p->left)//如果被替換結點是其父結點的左分支

else

if(newnode != null)

return root;

}bsnode* treedelete(bsnode* root,bsnode* todel)

else if (todel->right == null) //反之

//後繼的位置可以直接由其右孩子繼承,

else //否則比較複雜了,後繼用來替換被刪結點,因為後繼的左孩子為空,

root = transplant(root,todel,successor);//用後繼替換被刪結點

successor->left = todel->left;

successor->left->p = successor;

} return root;

}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...