tree.h
#pragma once
typedef char TreeNodeType;
typedef struct TreeNode {
TreeNodeType data;
struct TreeNode* lchild;
struct TreeNode* rchild;
} TreeNode;
void TreeInit(TreeNode** root); //初始化二叉树
void PreOrder(TreeNode* root); //递归先序遍历
void InOrder(TreeNode* root); 递归中序遍历
void PostOrder(TreeNode* root); 递归后序遍历
void LevelOrder(TreeNode* root); //层序遍历
TreeNode* _TreeCreate(TreeNodeType array[], size_t *index,size_t size, TreeNodeType null_node);
void TreeDestroy(TreeNode* root);
TreeNode* TreeClone(TreeNode* root); //二叉树的克隆
size_t TreeSize(TreeNode* root); //求节点个数
size_t TreeLeafSize(TreeNode* root); //求叶子节点个数
size_t TreeKLevelSize(TreeNode* root, int K); //第K层节点个数
size_t TreeHeight(TreeNode* root); //二叉树的高度
TreeNode* TreeFind(TreeNode* root, TreeNodeType to_find); //二叉树的查找
reeNode* LChild(TreeNode* node); //查找当前节点的左子树
TreeNode* RChild(TreeNode* node); //查找当前节点的右子树
TreeNode* Parent(TreeNode* root, TreeNode* node); //查找当前节点的父节点
void PreOrderByLoop(TreeNode* root); //非递归先序遍历
void InOrderByLoop(TreeNode* root); //非递归中序遍历
void PostOrderByLoop(TreeNode* root); //非递归后序遍历
void TreeMirror(TreeNode* root); //镜像二叉树
int IsCompleteTree(TreeNode* root);//判读是否为完全二叉树
tree.c
#include"seqstack.h"
#include<stdio.h>
#include"tree.h"
#include"linkqueue.h"
#include<stdlib.h>
void TreeInit(TreeNode** root)
{
if(root == NULL)
{
return;
}
*root = NULL;
}
void PreOrder(TreeNode* root)
{
if(root == NULL)
{
return;
}
printf("%c ",root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
void InOrder(TreeNode* root)
{
if(root == NULL)
{
return;
}
InOrder(root->lchild);
printf("%c ",root->data);
InOrder(root->rchild);
}
void PostOrder(TreeNode* root)
{
if(root == NULL)
{
return;
}
PostOrder(root->lchild);
PostOrder(root->rchild);
printf("%c ",root->data);
}
void LevelOrder(TreeNode* root)
{
if(root == NULL)
{
return;
}
LinkQueue queue;
LinkQueueInit(&queue);
LinkQueuePush(&queue,root);
while(1)
{
LinkQueueType top;
int ret = LinkQueueFront(&queue,&top);
if(ret &