二叉树相关操作

来源:互联网 发布:linux grep命令详解 编辑:程序博客网 时间:2024/04/26 08:19

创建二叉树

  1. 从键盘输入字符创建二叉树
BTree CreateTleft(){    BinaryTree* temp = NULL;    ElemType a = 0;    scanf_s("%c", &a);    if (a != '#')    {        temp = BuyNode();        temp->data = a;        temp->leftchild = CreateTleft();//先建立左孩子,再建立右孩子,左孩子递归遇到空返回,再递归右孩子        temp->rightchild = CreateTleft();    }    return temp;}

核心思想:输入字符,判断该字符是否为空,上面的代码以#代表空(NULL),若不为空,建立新的结点,将字符赋值给该结点,并对该结点的左孩子和右孩子进行相同的遍历。
1.2创建树,不同的传值方式

BTree CreateTmiddle_string(char** const p){    BinaryTree* node = NULL;    if (**p != '#' && *p != NULL && **p != NULL)    {        node = BuyNode();        node->data = (**p);        node->leftchild = CreateTmiddle_string(&(++*p));        node->rightchild = CreateTmiddle_string(&(++*p));    }    return node;}

核心思想:和第一个创建树的思路是一样的,不同的是其传值方式不同,采用了二级指针的方式,用到了引用,希望后续可以看看这方面的书。
2.查找二叉树的大小

int Size_BiTree(BinaryTree* ptr){    if (ptr != NULL)    {        return (Size_BiTree(ptr->leftchild)+Size_BiTree(ptr->rightchild)+1);    }    return 0;}

核心思想:一颗树的结点个数等于左子树结点数加右子树的结点数加1,递归思想,查找每个节点。
3.遍历第K层结点

void floor_orderk(BinaryTree* ptr, int k)//遍历第几层的结点{    if (ptr == NULL || k < 0)    {        return;    }    degreeorderk(ptr, k);}void degreeorderk(BinaryTree* ptr, int k){    if (ptr != NULL&&k == 0)    {        printf("%c ", ptr->data);    }    if (ptr->leftchild != NULL)    {        degreeorderk(ptr->leftchild,k-1);    }    if (ptr->rightchild != NULL)    {        degreeorderk(ptr->rightchild,k-1);    }}

核心思想:遍历每个节点,若该结点在第K层则打印出来,通过传递k值来确定是否在第k层。若打印第0层,则只需要递归一次,若需要打印第5层,则需要递归5次,所以用k是否递归到,及减减的次数来判断。
4.判断两个树是否相同

bool Equal(BinaryTree *pa, BinaryTree *pb){    if (pa != NULL&&pb != NULL&&pa->data==pb->data)    {        Equal(pa->leftchild, pb->leftchild);        Equal(pa->rightchild, pb->rightchild);        return true;    }    return false;}

核心思想:同时遍历两个树的左右孩子和根节点,比较值和结构是否相同。
5.查找双亲结点

BTree  Parent(BinaryTree *ptr, BinaryTree *child){    if (ptr==NULL||ptr->leftchild== child || ptr->rightchild == child)    {          return ptr;    }    else    {        BinaryTree* s = Parent(ptr->leftchild, child);        if (s == NULL)        {            s = Parent(ptr->rightchild, child);        }        return s;    }   }

核心思想:遍历每个节点,若其左右孩子中有一个为child结点,则返回该结点,否则向下遍历。
6.按值查找结点

BTree FindValue(BinaryTree *ptr, ElemType x){    if (ptr == NULL|| ptr->data == x)    {        return ptr;    }    else    {        BinaryTree* s = FindValue(ptr->leftchild, x);        if (s == NULL)        {            s = FindValue(ptr->rightchild, x);        }        return s;    }}

核心思想:同查找结点是同样的思路。