zoukankan      html  css  js  c++  java
  • 数据结构之二叉树--C语言

    二叉树是一种依托指针建立的数据结构。二叉树结构体中包含数据域和两个指针,一个指向左树,一个指向右树。开始的第一个结点称为二叉树的根节点,需要创建一个指向根节点的指针,这样才能访问整棵二叉树。

    我所知的有两种建立方式。第一种是设个函数的返回类型为二叉树结点结构体。例如:

    typedef struct TreeNode{

     char data;
    struct TreeNode *left;
    struct TreeNode *right;

    }TreeNode,*PTreeNode;

    PTreeNode create(PTreeNode node){

    .........

    }

    主函数中写入:main (){

     PTreeNode root;

     root=create(root);

    第二种方法是在create函数中传入(PTreeNode )&node。直接修改地址中的值

    void create((PTreeNode)&node){

    }

    这样处理之后,就能够对二叉树进行操作了。

    代码::

    typedef struct BTreeNode{
     int data;
     struct BTreeNode *left;//左树
     struct BTreeNode *right;//右树
    }BTreeNode,*PBTreeNode;

    二叉树的建立:

    void createTree(PBTreeNode &node){//建立树 
    	int c;
    	scanf("%d",&c);
    	if(c==0)
    		
    		{
    		node=NULL;
    		//printf("当前所处第%d结点处
    ");
    		} 
    	else
    	{
    		node=(BTreeNode *)malloc(sizeof(BTreeNode));	
    		node->data=c;
    		createTree(node->left);
    		createTree(node->right);
    }
    }
    


    二叉树的先序遍历:

    void ergodic_first(PBTreeNode node){//遍历结点 
    	if(node!=0)
    		{	
    			printf("结点数据=%d
    ",node->data);
    			ergodic_first(node->left);
    			//printf("右树结点数据=%d
    ",node->data);
    			ergodic_first(node->right);
    		}
    }


    二叉树的中序遍历:

    void ergodic_middle(PBTreeNode node){
    	if(node!=0){
    		ergodic_middle(node->left);
    		printf("结点数据=%d
    ",node->data);
    		ergodic_middle(node->right);
    	}
    }


    二叉树的后序遍历:

    void ergodic_behind(PBTreeNode node){
    	if(node!=0){
    		ergodic_behind(node->left);
    		ergodic_behind(node->right);
    		printf("结点数据=%d
    ",node->data);
    	}
    }


    求二叉树的深度:

    int TreeDeepth(PBTreeNode node){
    	if(node==0)
    		return 0;
    	int nleft=TreeDeepth(node->left);
    	printf("迭代第%d次
    ",nleft);
    	int nright=TreeDeepth(node->right);	
    	printf("迭代第%d次
    ",nright);
    		return nleft>nright?nleft+1:nright+1;
    }


    主函数:

    int main(){
    	BTreeNode *root;
    	//init(&node);
    	//建树
    	createTree(root);
    	printf("二叉树建立完成
    ");
    	printf("先序遍历
    "); 
    	ergodic_first(root);
    	printf("中序遍历
    ");
    	ergodic_middle(root);
    	printf("后序遍历
    ");
    	ergodic_behind(root);
    	printf("遍历完成
    ");
    	deep=TreeDeepth(root);
    	printf("树的深度为:%d
    ",deep);
    	return 0;
    } 

    可以发现二叉树的创建、遍历、求深度都使用到了递归。这是由二叉树的结构决定的。

    对比链表,可以发现链表也使用了指针访问下一个结点。可见链表也可以采用递归的算法完成创建、遍历、求长、删除等功能。如,建立一个单链表。

    typedef struct LinkNode{

     int data;
    struct LinkNode *next;

    }LinkNode;

    void createLink(LinkNode *node){

     int d;scanf("%d",&d);

     if(d!=0)

     {

    node=(LinkNode *)malloc(sizeof(LinkNode));

    node->data=d;

    createLink(node->next);

    }

    else

     node=NULL;

    }

    但是,这种方式明显占用很多的内存。


  • 相关阅读:
    spring 配置版本问题
    sublime与Emment
    工欲善其事必先利其器之浏览器篇
    工欲善其事必先利其器之windows篇
    工欲善其事必先利其器之搜索引擎
    营销自我
    java必备技能
    离线安装ADT和sdk
    eclipse的小技巧
    匿名内部类
  • 原文地址:https://www.cnblogs.com/deciduousmap/p/12193728.html
Copyright © 2011-2022 走看看