您的位置:首页 > 其它

二叉树问题汇总(1)—基础问题

2012-07-19 21:09 295 查看

1、创建二叉搜索树

二叉搜索树是排序的二叉树,即左子树的值都不大于根结点,右子树的值都比根结点大。插入结点到一颗二叉搜索树可以使用递归或者非递归方法。使用递归方法代码简单,使用非递归则易于理解。

二叉搜索树BST定义:

struct node {
int data;
struct node* left;
struct node* right;
};
二叉搜索树创建结点代码:

struct node* newNode(int data)
{
struct node* nd = (struct node*)malloc(sizeof(struct node)); //分配空间
nd->data = data;                  //设置data域
nd->left = nd->right = NULL;      //初始化左右孩子结点为NULL
return nd;
}


二叉搜索树插入结点代码1(递归,函数返回根结点):

struct node* insert(struct node* root, int data)
{
if (root == NULL) {  //二叉树为空,则创建结点直接返回。
return newNode(data);
} else {
if (root->data >= data) { //如果根结点值大于或等于插入值,则插入结点到左子树。
root->left = insert(root->left, data); 
} else {                  //如果根结点值小于插入值,则插入结点到右子树。
root->right = insert(root->right, data);
}
return root;    //返回根结点指针。
}
}


二叉搜索树插入节点代码2(递归,函数无返回值):

void insert2(struct node** rootRef, int data)
{
struct node* root = *rootRef;
if (root == NULL) {
*rootRef = newNode(data);
return;
}
if (root->data >= data)
insert2(&(root->left), data);
else
insert2(&(root->right), data);
}


二叉搜索树插入节点代码3(非递归):

void insert3(struct node** rootRef, int data)
{
struct node* root = *rootRef;
struct node* nd = newNode(data);
if (root == NULL) {
*rootRef = nd;
return;
}
struct node* parent = NULL;
struct node* current = root;
while (current != NULL) {
parent = current;   //parent跟踪结点插入,直到其孩子结点为NULL
if (current->data >= data)
current = current->left;
else
current = current->right;
}
if (parent->data >= data) //判断应该插入到左孩子还是右孩子
parent->left = nd;
else
parent->right = nd;
}


创建二叉搜索树,包含3个结点:

//直接创建二叉树
struct node* build123a() {
struct node* root = newNode(2);
root->left = newNode(1);
root->right = newNode(3);
return(root);
}
//使用insert创建二叉搜索树
struct node* build123b() {
struct node* root = NULL;
root = insert(root, 2);
root = insert(root, 1);
root = insert(root, 3);
return(root);
}


2、二叉树结点数目(不需要是二叉搜索树)

//结点数目=左子树结点数目+右子树节点数目+1(根结点)
int size(struct node* root)
{
if (root == NULL) return 0;
return size(root->left) + size(root->right) + 1;
}


3、二叉树深度(根结点到最远叶结点距离,空树深度为0)

int maxDepth(struct node* root)
{
if (root == NULL)
return 0;
else {
int lDepth = maxDepth(root->left);  //递归获取左子树深度
int rDepth = maxDepth(root->right); //获取右子树深度
return lDepth>rDepth? lDepth+1: rDepth+1; //取较大值+1即为二叉树深度
}
}


4、二叉搜索树最小值(最大值类似,查询右子树即可)

//根据二叉搜索树性质,直接往左子树迭代查询
int minValue(struct node* root)
{
assert(root != NULL);
struct node* current = root;
while (current->left != NULL) {
current = current->left;
}
return current->data;
}


//递归算法查询二叉搜索树最小值
int minValue(struct node* root)
{
assert(root != NULL);
if (root->left == NULL) return root->data;
else return minValue(root->left);
}

5、查找二叉搜索树中是否存在某个值

/*查找二叉搜索树中是否存在值为target的结点*/
bool lookup(struct node* root, int target)
{
if (root == NULL)
return false;
if (root->data == target)
return true;
else if (root->data > target)
return lookup(root->left, target);
else
return lookup(root->right, target);
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: