• [数据结构] 二叉树的操作实现


          如果自上而下按层次,自左至右输入每一个结点的一个三元组(N,P, L/R)。当中N 为本结点的元素。P为其父结点。L 指示N为P 的左孩子,R指示N 为P的右孩子。试写一个建立二元树的左右链表示算法,并实现先根、中根、后根以及层序遍历算法。

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 100
    
    typedef int Elementtype;
    
    struct node
    {
    	struct node *lchild;
    	struct node *rchild;
    	Elementtype data;
    };
    
    typedef node *BTREE;
    
    BTREE CreateTree();
    int IsEmpty(BTREE root);
    void Visit(int n);
    void InOrder(BTREE root); 
    void PostOrder(BTREE root);
    void PreOrder(BTREE root);
    
    int main()
    {
    	struct node *root;
    	BTREE tree[MAX];
    	root = CreateTree();
    	
    	printf("中根遍历:
    ");
    	InOrder(root);
    	printf("
    ");
    	
    	printf("先根遍历:
    ");
    	PreOrder(root);
    	printf("
    ");
    	
    	printf("后根遍历:
    ");
    	PostOrder(root);
    	printf("
    ");
    	
    	return 0;
    } 
    
    BTREE CreateTree()
    {
    	BTREE root;
    	BTREE newNode;
    	BTREE tree[MAX];
    	Elementtype data;
    	int number;//记录节点位置 
    	int i;
    	int j=1;
    	char LR;
    	
    	root = new struct node;//新建根节点 
    	root->lchild = NULL;
    	root->rchild = NULL;
    	
    	printf("输入根节点数据:
    ");
    	scanf("%d",&data);
    	root->data = data;
    	number = 0; 
    	tree[0] = root;
    	
    	printf("输入三元组(节点数据。节点标号(从0開始),L/R),以输入0,0,0作为结束
    ");
    	scanf("%d,%d,%c",&data,&i,&LR);
    	while(data!=0 || i!=0 || LR != '0')//以输入0,0,0作为结束 
    	{
    		newNode = new struct node;
    		newNode->data = data;
    		number++;
    		tree[number] = newNode; 
    		if(LR == 'L')
    		{
    			tree[i]->lchild = newNode;
    		}
    		if(LR == 'R')
    		{
    			tree[i]->rchild = newNode;
    		}
    		newNode->lchild = newNode->rchild = NULL;//初始化
    		
    		printf("输入三元组(节点数据。节点标号。L/R),以输入0,0,0作为结束
    ");
    	    scanf("%d,%d,%c",&data,&i,&LR); 		
    	}
    	
    	root = tree[0];
    	
    	printf("层序遍历:
    ");
    	for(i=0;i<number+1;i++)
    	  printf("%d ",tree[i]->data);
    	printf("
    ");
    	return  root;	
    } 
    
    int IsEmpty(BTREE root)
    {
        if (root == NULL)
        {
            return 1;
        }
        else
            return 0;
    }
    
    void Visit(Elementtype data)
    {
        printf("%d ",data);
    }
    
    void InOrder(BTREE root)//中根遍历 
    {
        if (IsEmpty(root) == 0)
        {
            InOrder(root->lchild);
            Visit(root->data);
            InOrder(root->rchild);
        }
    }
    
    void PreOrder(BTREE root)//先根遍历 
    {
        if(IsEmpty(root) == 0)
        {
            Visit(root->data);
            PreOrder(root->lchild);
            PreOrder(root->rchild);
        }
    }
    
    void PostOrder(BTREE root)//后根遍历 
    {
        if(IsEmpty(root) == 0)
        {
            PostOrder(root->lchild);
            PostOrder(root->rchild);
            Visit(root->data);
        }
    }
    

    以上供君參考

  • 相关阅读:
    常用数据类型占用内存大小
    A2W,W2A等的使用
    Java 注释规范
    windows WTL使用命令行参数
    C++ for循环与迭代器
    C++11 正则表达式简单运用
    LINUX部署SVN服务器
    LINUX搭建PySpider爬虫服务
    Linux常用操作指令
    Centos搭建Seafile个人网盘
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6971885.html
Copyright © 2020-2023  润新知