二叉查找树与平衡二叉树
二叉查找树
二叉查找树的性质:对于树中的每一个节点X,它的左子树中所有关键字值小于X的关键字值,它的右子树中的所有关键字值大于X的关键字值。
二叉查找树的平均深度为O(logN),下面看一下它的相关的操作函数。
删除一个二叉树(递归形式):
void MakeEmpty(TreeNode *root) { if(root == NULL) return; MakeEmpty(root->left); MakeEmpty(root->right) free(root); }
在二叉查找树中找都某个节点:
TreeNode* Find(TreeNode *root, int x) { if(root == NULL) return NULL; if(root->val > x) return Find(root->left, x); else if(root->val < x) return Find(root->right, x); else return root; }
在二叉查找树中找最大值:
//递归版本 TreeNode* FindMax(TreeNode *root) { if(root == NULL) return NULL; if(root->right == NULL) return root->right else return FindMax(root->right); } //迭代版本 TreeNode* FindMax(TreeNode *root) { if(root == NULL) return NULL; while(root->right != NULL) { root = root->right; } retur root; }
在编写算法之前,首先把测试用例写好真的很重要,因为测试用例的边界值就是递归函数的出口。
二叉查找树的插入操作:
二叉查找树的插入操作很简单,因为第一个要建立的结点一定是根节点,然后每一个结点的插入肯定在叶子结点的地方。
TreeNode* Insert(TreeNode *root, int x) { if(root == NULL) { root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = x; root->left = NULL; root->right = NULL; } else { if(root->val > x) root->left = Insert(root->left, x); else if(root->val < x) root->right = Insert(root->right, x); } return root; }