数据结构:c++高级数据算法----》树的创建&树的基本操练

树的基本操练:

1.求叶子结点的数目

代码:

//定义全局变量
int sum;
void CountLeafNum(BiTNode*T)
{
   if( T != NULL)
   {
     if(T->child == NULL && T->child == NULL)
     {
        sum++;
     }
     if(T->lchild)//左子树
     {
        coutLeaf(T->lchild);
     }
     
     if(T->rchild)//右子树
     {
        coutLeaf(T->rchild);
     }
   }
}

int main()
{
    sum = 0;
    
    coutLeaf(&t1);
    printf("sum:%d \n",sum);
}

但这个代码中定义一个全局变量sum,就会引来资源临界问题。优化代码如下

递归:

void CountLeafNum1(BiTNode*T,int *sum)
{
   if( T != NULL)
   {
     if(T->child == NULL && T->child == NULL)
     {
        (*sum)++;
     }
     if(T->lchild)//左子树
     {
        coutLeafNum1(T->lchild,sum);
     }
     
     if(T->rchild)//右子树
     {
        coutLeafNum1(T->rchild,sum);
     }
   }
}

int main()
{
    int mysum = 0;   
    coutLeafNum1(&t1,&sum);
    printf("sum:%d \n",sum);
}

2.copy二叉树

BiTNode * CopyTree(BiTNode * T)
{
  BiTNode * newNode = NULL;
  //定义一个左孩子
  BiTNode * newLp = NULL;
  //定义一个右孩子
  BiTNode * newRp = NULL;

  if(T == NULL)
  {
     return NULL;
  }
  //copy左子树
  if(T->lchild != NULL)
  {
     newLp = CopyTree(T->lchild);
  }
  else
  {
     newLp = NULL;
  }

  //拷贝右子树
  if(T->child != NULL)
  {
     newRp = CopyTree(T->rchild);
  }
  else
  {
     newRp = NULL;
  }
  
  //malloc根节点
  newNode =(BiTNode* )malloc(sizeof(BiTNode));
  
 if(newNode == NULL)
 {
    return NULL;
 }
 newNode->lchild = newLp;
 newNode->rchild = newRp;
 newNode->data = T->data;

 return NULL;
}

int main()
{
   BiTNode t1,t2,t3,t4,t5;
   memset(&t1,0,sizeof(BiTNode));
   memset(&t2,0,sizeof(BiTNode));
   memset(&t3,0,sizeof(BiTNode));
   memset(&t4,0,sizeof(BiTNode));
   memset(&t5,0,sizeof(BiTNode));
   t1.data = 1;
   t2.data = 2;
   t3.data = 3;
   t4.data = 4;
   t5.data = 5;

   //建立关系
   t1.lchild = &t2;
   t1.rchild = &t3;
   t2.lchild = &t4;
   t3.lchild = &t5;
   
   //树的遍历
   printf("%d\n",Depth(&t1));
   [
       BiTNode *root = CoptTree(&t1);//生成一颗新树
       printf("Copy inorder\n");
       inOrder(root);
       printf("hello....\n");
   ]

   printf("older inorder\n");
   inOrder(&t1);
   printf("hello....\n");
    
   return;  
}

3.求树的深度

void inOrder(BiTNode *root)
{
    if(root == NULL)
    {
        return;
    }
    
    inOrder(root->lchild);
    inOrder(root->rchild);
}

int Depth(BiTNode *T)
{
   int deptleft = 0;//左子树的高度
   int deptright = 0;//右子树的高度
   int deptval = 0;
   
   if(T == NULL)
   {
       deptval = 0;
       return deptval;
   }

   deptleft = Depth(t->lchild);//求左子树高度
   deptleft = Depth(t->rchild);//求右子树高度
   //谁大加1(根节点高度)
   deptval = 1+(deptleft > deptright  ? deptleft:deptright);
    

   return deptval;
}
int main()
{
   BiTNode t1,t2,t3,t4,t5;
   memset(&t1,0,sizeof(BiTNode));
   memset(&t2,0,sizeof(BiTNode));
   memset(&t3,0,sizeof(BiTNode));
   memset(&t4,0,sizeof(BiTNode));
   memset(&t5,0,sizeof(BiTNode));
   t1.data = 1;
   t2.data = 2;
   t3.data = 3;
   t4.data = 4;
   t5.data = 5;

   //建立关系
   t1.lchild = &t2;
   t1.rchild = &t3;
   t2.lchild = &t4;
   t3.lchild = &t5;
   
   //树的遍历
   printf("%d\n",Depth(&t1));
   printf("inorder\n");
   inOrder(&t1);
   printf("hello...\n");
    
   return;  
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值