Tree头文件

#ifndef BINARY_TREE_H
#define BINARY_TREE_H
#include<iostream>
#define MAX 100
using namespace std;
typedef struct Bitree
{
   int data;
   struct Bitree *lchild,*rchild;
}Binode,*bitree;

typedef bitree QDataType;
typedef struct
{
 QDataType data[MAX+1];
 int front,rear;
}Queue;
//(1)初始化队列q
void InitQueue(Queue &q)
{
q.front=0;
q.rear=0;
}

//(2)判断队列q是否非空;
int EmptyQueue(Queue &q)
{
if(q.rear==q.front) return 1;
else return 0;
}


//(3)依次进队元素a,b,c
void InsqQueue(Queue &q,QDataType x)
{
if(q.rear==MAX){printf("overflow"); }
q.rear++;
q.data[q.rear]=x;

}
//(4)出队一个元素,输出该元素;
 int OutsqQueue(Queue &q,bitree &p)
{
if(EmptyQueue(q))
{
printf("underflow");
return 0;
}
else
{
p=q.data[q.front+1];
q.front++;
}
if(EmptyQueue(q))
{q.front=0;q.rear=0;}
return 1;
}

 void InitBiTree(bitree &T) // 构造空二叉树
 {
  T=NULL;
 }
 int IsEmpty(bitree T)//判断二叉树是否为空
{ if(T==NULL)
return true;
else
return false;
}
void creatbitree(bitree &T)//创建一棵非空二叉树
{
   int num;
   cin>>num;
   if(num==0)
      T=NULL;
   else
   {
      T=(bitree)malloc(sizeof(Binode));
      T->data=num;
      creatbitree(T->lchild);
      creatbitree(T->rchild);
   }
}
int Root(bitree T)//返回此二叉树的根节点
{bitree p;
p=T;
if(T==NULL)return 0;
else return p->data;
}
 int nodeexist(bitree T,bitree p)//判定节点是否在二叉树中
{
  if(T==NULL||p==NULL) return false;
 if(T==p)return true;
 else return nodeexist(T->rchild,p)||nodeexist(T->lchild,p);
}
 int Value(bitree T,bitree p)//返回此二叉树中节点p的值
{
 if(T==NULL||p==NULL) return false;
 if(T==p)return p->data;
 else return Value(T->rchild,p)||Value(T->lchild,p);
}
  bitree Parent(bitree T,bitree p)//此二叉树中节点p的双亲
 {
  bitree n;
  if(p==T) return NULL;
     else if(p==T->lchild||p==T->rchild) return T;
     else
  {
   if(n==Parent(T->lchild,p))
    return n;
   return Parent(T->rchild,p);
  }
 }
 int  LeftChild(bitree T,bitree n) //返回此二叉树中节点p的左孩子
 {
  if(T==NULL||n==NULL) return false;
 if(T==n)return n->lchild->data;
 else return  LeftChild(T->rchild,n)|| LeftChild(T->lchild,n);
  //if(!nodeexist(T,n))
// return NULL;
 //else return (n->lchild->data);
 }
int  RightChild(bitree T,bitree n)//返回此二叉树中节点p的右孩子
{
 if(T==NULL||n==NULL) return false;
 if(T==n)return n->lchild->data;
 else return  RightChild(T->rchild,n)|| RightChild(T->lchild,n);
 //if(!nodeexist(T,n))
   //return NULL;
 //else return (n->rchild->data);
}
int InOrderTraverse(bitree T)//返回二叉树的中序遍历序列
{
   if(T==NULL)
       return 0;
   else
   {
     InOrderTraverse(T->lchild);
      cout<<T->data;
      InOrderTraverse(T->rchild);
   }
}
int PreOrderTraverse(bitree T)//返回二叉树的先序遍历序列
{
   if(T==NULL)
       return 0;
   else
   {
      cout<<T->data;
      PreOrderTraverse(T->lchild);
      PreOrderTraverse(T->rchild);
   }
}
int PostOrderTraverse(bitree T)//返回二叉树的后序遍历序列
{
   if(T==NULL)
       return 0;
   else
   {
     PostOrderTraverse(T->lchild);
     PostOrderTraverse(T->rchild);
     cout<<T->data;
   }
}
int count(bitree T)//节点数
{
   if(T==NULL)
      return 0;
   else
      return (count(T->lchild)+count(T->rchild)+1);
}
 
int depth(bitree T)//二叉树的深度
{
   int rcount,lcount;
   if(T==NULL)
       return 0;
   else
   {
           lcount=depth(T->lchild);
       rcount=depth(T->rchild);
   }
   if(lcount>rcount)
       return (lcount+1);
   else
       return (rcount+1);
}
void Destroybitree(bitree &T)// 销毁二叉树
{
   if(T)
   {
      if(T->lchild)
          Destroybitree(T->lchild);
      if(T->rchild)
          Destroybitree(T->rchild);
      free(T);
      T=NULL;
   }
}
 void LevelOrderTraverse(bitree T)// 层序遍历二叉树
{
Queue q;
InitQueue(q);
bitree p,p1,p2;
p=T;//(Tree)malloc(sizeof(TreeNode));
if(p)InsqQueue(q,p);
while(!EmptyQueue(q))
{
OutsqQueue(q,p);
printf("%d",p->data);
p1=p->lchild;p2=p->rchild;
if(p1) InsqQueue(q,p1);
if(p2) InsqQueue(q,p2);
}

}

#endif

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树的头文件通常包含以下内容: 1. 结构体定义:定义二叉树节点的结构体,包括节点值、左右子树指针。 ```c typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; ``` 2. 函数声明:声明二叉树相关的函数,包括创建二叉树、插入节点、删除节点、查找节点等。 ```c // 创建二叉树 TreeNode* createTree(int arr[], int size); // 插入节点 void insertNode(TreeNode **root, int val); // 删除节点 void deleteNode(TreeNode **root, int val); // 查找节点 TreeNode* searchNode(TreeNode *root, int val); ``` 3. 其他辅助函数:如遍历二叉树的函数、计算二叉树高度的函数等。 ```c // 前序遍历 void preOrderTraversal(TreeNode *root); // 中序遍历 void inOrderTraversal(TreeNode *root); // 后序遍历 void postOrderTraversal(TreeNode *root); // 计算二叉树高度 int getHeight(TreeNode *root); ``` 完整的二叉树头文件示例: ```c #ifndef _BINARY_TREE_H_ #define _BINARY_TREE_H_ #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; TreeNode* createTree(int arr[], int size); void insertNode(TreeNode **root, int val); void deleteNode(TreeNode **root, int val); TreeNode* searchNode(TreeNode *root, int val); void preOrderTraversal(TreeNode *root); void inOrderTraversal(TreeNode *root); void postOrderTraversal(TreeNode *root); int getHeight(TreeNode *root); #endif ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值