数据结构之二叉树学习
二叉树的特性:
二叉树成为二叉查找树的性质是,对于树种的每个节点X,他的左子树中的所有关键字的值均小于X的关键字的值,而他的右子树中的所有关键字的值均大于X的关键字的值。这意味着,该树的所有元素均可以是用某种统一的方式排序。
tree.h
#pragma once
//we define the binary tree.
struct treeNode;
typedef struct treeNode * Tree;
struct treeNode
{
int elem;
Tree left;
Tree right;
};
Tree treeCreat(int val);
Tree treeInsert(Tree tr, int val);
Tree treeDelete(Tree tr, int val);
Tree treeFind(Tree tr, int val);
Tree treeFindMax(Tree tr);
Tree treeFindMin(Tree tr);
tree.c
#include "stdafx.h"
#include "tree.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
Tree treeCreat(int val)
{
Tree tr = (Tree)malloc(sizeof(struct treeNode));
tr->elem = val;
tr->left = NULL;
tr->right = NULL;
return tr;
}
Tree treeInsert(Tree tr, int val)
{
if (tr == NULL)
{
tr =treeCreat(val);
}
else if (val < tr->elem)
tr->left = treeInsert(tr->left, val);
else if (val > tr->elem)
tr->right = treeInsert(tr->right, val);
return tr;
}
Tree treeDelete(Tree tr, int val) //二叉树种非常关键的一个函数,
{
Tree temp;
if (tr == NULL)
{
cout << "cann't find the elements" << endl;
}
else if (val < tr->elem)
{
tr = treeDelete(tr->left, val);
}
else if (val > tr->elem)
{
tr = treeDelete(tr->right, val);
}
if (tr->left && tr->right) //如果tr又两个孩子,
{
temp = treeFindMin(tr->right);
tr->elem = temp->elem;
tr = treeDelete(tr->right, tr->elem); //将删除temp的机会留到最后
}
else
{
temp = tr; //这里没有用到temp,
if (tr->left == NULL)
tr = tr->right;
else if (tr->right == NULL)
tr = tr->left;
free(temp); // 调用free函数的任务放在这里。
}
return tr;
}
Tree treeFind(Tree tr, int val)
{
if (tr == NULL)
return NULL;
else if (val < tr->elem)
treeFind(tr->left, val);
else if (val > tr->elem)
treeFind(tr->right, val);
else
return tr;
}
Tree treeFindMax(Tree tr)
{
if (tr == NULL)
return NULL;
if (tr->right != NULL)
{
treeFindMax(tr->right);
}
return tr;
}
Tree treeFindMin(Tree tr)
{
if (tr == NULL)
return NULL;
if (tr->left != NULL)
{
treeFindMin(tr);
}
return tr;
}