zoukankan      html  css  js  c++  java
  • 二叉树的基础操作

    BinTree.h

    #ifndef _BINTREE_H_
    #pragma once 
    
    #include<stdio.h>
    #include<assert.h>
    #include<malloc.h>
    #include<windows.h>
    
    typedef int BTDataType; 
    
    //typedef struct TreeNode 
    //{ 
    // BTDataType _data; 
    // struct TreeNode* _firstChild; 
    // struct TreeNode* _nextBrother; 
    //}TreeNode; 
    
    typedef struct BinaryTreeNode 
    { 
    	struct BinaryTreeNode* _left; 
    	struct BinaryTreeNode* _right; 
    	BTDataType _data; 
    }BTNode; 
    #include "Queue.h" 
    //#include "Stack.h" 
    
    BTNode* BuyBTNode(BTDataType x) ;
    // 创建二叉树 
    BTNode* CreateBTree(BTDataType* a, size_t* pIndex, BTDataType invalid) ;
    void BTreePrevOrder(BTNode* root) ;
    void BTreeInOrder(BTNode* root) ;
    void BTreePostOrder(BTNode* root) ;
    
    size_t BTreeSize(BTNode* root) ;
    size_t BTreeLeafSize(BTNode* root) ;
    size_t BTreeKLevelSize(BTNode* root, size_t k) ;
    size_t BTreeDepth(BTNode* root) ;
    BTNode* BTreeFind(BTNode* root, BTDataType x) ;
    void BTreeLevelOrder(BTNode* root) ;
    // 判断完全二叉树 
    int IsCompleteBTree(BTNode* root) ;
    int IsCompleteBTree1(BTNode* root) ;// flag的方式判断 
    // 非递归遍历 
    void BTreePrevOrderNonR(BTNode* root) ;
    void BTreeInOrderNonR(BTNode* root) ;
    void BTreePostOrderNonR(BTNode* root) ;
    
    void TestBinaryTree() ;
    
    #endif // !_BINTREE_H_
    

    BinTree.c

    #include"BinTree.h"
    
    BTNode* BuyBTNode(BTDataType x){
    	BTNode *node=(BTNode *)malloc(sizeof(BTNode));
    	node->_data=x;
    	node->_left=NULL;
    	node->_right=NULL;
    	return node;
    }
    
    BTNode* CreateBTree(BTDataType* a, size_t* pIndex, BTDataType invalid){
    	BTNode *root=NULL;
    	if(a[*pIndex]!=invalid){
    		root = BuyBTNode(a[*pIndex]);
    		(*pIndex)++;
    		root->_left = CreateBTree( a, pIndex, invalid);
    		(*pIndex)++;
    		root->_right = CreateBTree( a, pIndex, invalid);
    	}
    	return root;
    }
    void BTreePrevOrder(BTNode* root){
    	if(root==NULL)
    		return;
    
    	printf("%d ",root->_data);
    	BTreePrevOrder(root->_left);
    	BTreePrevOrder(root->_right);
    }
    
    void BTreeInOrder(BTNode* root) {
    	if(root==NULL)
    		return;
    	BTreeInOrder(root->_left);
    	printf("%d ",root->_data);
    	BTreeInOrder(root->_right);
    }
    
    void BTreePostOrder(BTNode* root) {
    	if(root==NULL)
    		return;
    	BTreeInOrder(root->_left);
    	BTreeInOrder(root->_right);
    	printf("%d ",root->_data);
    }
    
    size_t BTreeSize(BTNode* root) {
    	if(root==NULL)
    		return 0;
    	return BTreeSize(root->_left)+BTreeSize(root->_right)+1;
    }
    
    size_t BTreeLeafSize(BTNode* root) {
    	if(root==NULL)
    		return 0;
    	if(root->_left==NULL&&root->_right==NULL)
    		return 1;
    	return BTreeLeafSize(root->_left)+BTreeLeafSize(root->_right);
    }
    
    size_t BTreeKLevelSize(BTNode* root, size_t k){
    	if(root==NULL)
    		return 0;
    	if(k==1)
    		return 1;
    	return BTreeKLevelSize(root->_left, k-1)+
    		BTreeKLevelSize(root->_right,k-1);
    }
    
    size_t BTreeDepth(BTNode* root){
    	if(root==NULL)
    		return 0;
    	return BTreeDepth(root->_left)+1;
    }
    
    BTNode* BTreeFind(BTNode* root, BTDataType x) {
    	BTNode* leftNode, *rightNode;
    	if(root==NULL)
    		return NULL;
    	if(root->_data==x)
    		return root;
    	leftNode=BTreeFind(root->_left,x);
    	if(leftNode)
    		return leftNode;
    	rightNode=BTreeFind(root->_right,x);
    	if(rightNode)
    		return rightNode;
    }
    
    void BTreeLevelOrder(BTNode* root){  //层序遍历
    	Queue q;
    	QueueInit(&q);
    	QueuePush(&q,root);
    	while(QueueEmpty(&q)){
    		BTNode* cur=QueueFront(&q);
    		printf("%d ",cur->_data);
    		if(cur->_left)
    			QueuePush(&q,cur->_left);
    		if(cur->_right)
    			QueuePush(&q,cur->_right);
    		QueuePop(&q);
    	}
    	printf("
    ");
    }
    
    int IsCompleteBTree(BTNode* root) {
    	Queue q;
    	QueueInit(&q);
    	QueuePush(&q,root);
    	while(QueueEmpty(&q)){
    		BTNode* cur=QueueFront(&q);
    		if(cur==NULL){
    			break;
    		}
    		else{
    			QueuePush(&q,cur->_left);
    			QueuePush(&q,cur->_right);
    		}
    		QueuePop(&q);
    	}
    	while(QueueEmpty(&q)){
    		BTNode* cur=QueueFront(&q);
    		if(cur!=NULL)
    			return 0;
    		QueuePop(&q);
    	}
    	return 1;
    }
    
    int IsCompleteBTree1(BTNode* root) ;// flag的方式判断 
    // 非递归遍历 
    void BTreePrevOrderNonR(BTNode* root) ;
    void BTreeInOrderNonR(BTNode* root) ;
    void BTreePostOrderNonR(BTNode* root) ;
    
    
    void TestBinaryTree() 
    { 
    	int a[] = {1, 2, 3, '#', '#',4,'#', '#', 5, 6,'#' ,'#' ,'#' }; 
    	size_t index = 0; 
    	BTNode* tree = CreateBTree(a, &index, '#'); 
    	BTreePrevOrder(tree); 
    	printf("
    "); 
    	//BTreePrevOrderNonR(tree); 
    	BTreeInOrder(tree); 
    	printf("
    "); 
    	BTreePostOrder(tree); 
    	printf("
    "); 
    
    	printf("BTreeSize?       %d
    ", BTreeSize(tree)); 
    	printf("BTreeLeafSize?   %d
    ", BTreeLeafSize(tree)); 
    	printf("BTreeKLevelSize? %d
    ", BTreeKLevelSize(tree, 2)); 
    	printf("BTreeDepth?      %d
    ", BTreeDepth(tree)); 
    	printf("Find:            %d
    ",BTreeFind(tree,5)->_data);
    	BTreeLevelOrder(tree);
    	printf("IsCompleteBTree? %d
    ", IsCompleteBTree(tree)); 
    
    } 

  • 相关阅读:
    mysql不停库不锁表在线主从配置
    MySQL5.7不停机不锁表主从同步实战
    另类 k8s 集群灾难恢复方法:用 master 服务器镜像恢复出新集群
    我在新西兰卖挖掘机之续篇十八------坚持的秘诀(坚持的秘诀就2条,第一是初始摩擦力要足够小(开头不能太困难,时间不能太久);第二是坚持的事情能够不断地给你提供某种真实的好处)(其实就是正反馈,加上一点点兴趣)
    分布式系统中那些不靠谱任务-CAP 到底是什么
    分布式系统架构中关于切分数据库事务的 ACID 性质的可用性与性能-BASE 理论和CAP 定理
    SSO协议-SAML和OAuth2
    领域建模
    基于 Docker 容器Net Core微服务部署 Nginx 集群架构
    消息队列和分布式锁
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615372.html
Copyright © 2011-2022 走看看