二叉搜尋樹是紅黑樹的基礎。
原始碼:
#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 解釋 輸入為 ...