• 二叉树的建立基本操作(链表方式)(一)


            学习数据结构,一直对二叉树不了解,对指针的调用一知半解。

    这二天学二叉树,搞懂了一点点,先写出代码。以后再边学习边来改进。

    <pre name="code" class="html"><span style="font-size:18px;">#include <stdlib.h>
    #include <stdio.h>
    typedef char DataType;
    typedef struct node
    {
       DataType data;
       struct node *lchild;
       struct node *rchild;
    }BinTNode,*BinTree;
    void createB(BinTree &T)
    {
    	DataType ch;
    	scanf("%c",&ch);
    	if(ch=='.')
    		T=NULL;
    	else
    	{
    		T=(BinTNode *)malloc(sizeof(BinTNode));
    		T->data=ch;
    		createB(T->lchild);
    		createB(T->rchild);
    	}
    }
    void Inorder(BinTree &T)
    {
    	if(T!=NULL)
    	{
    		Inorder(T->lchild);
    		printf("%3c",T->data);
    		Inorder(T->rchild);
    	} 
    }
    int search(BinTree &T,DataType ch)
    {/*查找结点CH,找到返回1,否则返回0*/
    	if(T==NULL)
    	return 0;
    	if(T->data==ch)
    		return 1;
    	return  search(T->lchild,ch); 
    	return  search(T->rchild,ch);
    }
    void swapLR(BinTree &T)
    {  /*交换全部结点的左右分支X*/
    	BinTree t;
    	if(T!=NULL)
    	{
    		swapLR(T->lchild);
    		swapLR(T->rchild);
    		if(T->lchild==NULL&&T->rchild)
    		{
    			T->lchild=T->rchild;
    			T->rchild=NULL;
    		}
    		else
    		if(T->lchild&&T->rchild==NULL) 
    		{
    			T->rchild=T->lchild;
    			T->lchild=NULL;
    		}
    		else if(T->lchild&&T->rchild)
    		{
    			t=T->lchild;
    			T->lchild=T->rchild;
    			T->rchild=t;
    		}
    	}
    }
    int sortBT(BinTree &T)
    {/*推断是否为二叉排序树*/
    	if(T==NULL)
    	return 1;
    	if((T->lchild&&T->lchild->data<T->data)||(T->rchild&&T->rchild->data>T->data))
    	   return 0;
    	return	sortBT(T->lchild);
    	return 	sortBT(T->rchild);
    }
    /*二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:
     (1)若左子树不空,则左子树上全部结点的值均小于它的根结点的值; 
     (2)若右子树不空,则右子树上全部结点的值均大于它的根结点的值;
     (3)左、右子树也分别为二叉排序树;*/
    void countdef(BinTree T,int &n)
    {  /*统计叶子结点数*/
    	if(T!=NULL)
    	{
    		if(T->lchild==NULL&&T->rchild==NULL)
    			n++;
    		countdef(T->lchild,n);
    		countdef(T->rchild,n);
    	}
    }
    void depthBT(BinTree T,int d,int *h)
    {  /*求二叉树的深度*/
    	if(T)
    	{ 
    		d++;
    		if(d>*h)
    			*h=d;
    		depthBT(T->lchild,d,h);
    		depthBT(T->rchild,d,h);
    	}
    }
    void gradeBT(BinTree &T,DataType ch,int d,int *n)
    {/*求ch结点所在层数*/
    	if (T) 
    	{
    		d++;
    		if(T->data==ch)
    			*n=d;
    		gradeBT(T->lchild,ch,d,n);
    		gradeBT(T->rchild,ch,d,n);
    	}
    }
    int main(void)
    {
    	DataType ch;
    	BinTree root,t;
    	int d=0,h=0,l=1,n=0;
    	root=(BinTNode *)malloc(sizeof(BinTNode));                                        
    	printf("请依照先序遍历的顺序输入须要中序遍历的字符:
    ");
    	createB(root);
    	Inorder(root);
    	printf("
    ");
    	depthBT(root,d,&h);  
    	printf("depth=%d
    ",h);
    	gradeBT(root,'c',0,&l);
    	printf("grade=%d
    ",l);
    	countdef(root,n);
    	printf("count=%d
    ",n);
    	printf("
    ");
    	return 0; 
    }
    </span>


    
    


    /*程序执行后的结果是: 


    请依照先序遍历的顺序输入须要中序遍历的字符:
    abc..de.g..f...
      c  b  e  g  d  f  a
    depth=5
    grade=3
    count=3
    Press any key to continue 


    */

  • 相关阅读:
    (待续)【转载】 Deep Reinforcement Learning Doesn't Work Yet(这里有一篇深度强化学习劝退文)
    【转载】 深度强化学习走入「死胡同」,继续死磕电子游戏还是另辟蹊径?
    【转载】 Docker-关于docker cpu的限制后,实际效果的研究
    个人常用的 matplotlib 绘图模板
    【转载】共轭梯度法(视频讲解) 数值分析6(3共轭梯度法) ——苏州大学
    【转载】 向量,标量对向量求导数
    【转载】 Linux Hang Task 简介
    AOC U2790PC对比上一代的AOC U2790PQU怎么样?
    屏幕ppi
    ubuntu杀死进程
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6985845.html
Copyright © 2020-2023  润新知