如果完全二叉树的深度为h,那么除了第h层外,其他层的节点个数都是满的,第h层的节点都靠左排列。
完全二叉树的编号方法是从上到下,从左到右,根节点为1号节点,设完全二叉树的节点数为sum,某节点编号为i,
当2*i <= sum时,有左孩子,其编号为2*i,否则没有左孩子,本身为叶节点。
当2*i+1 <= sum时,有右孩子,其编号为2*i+1,否则没有右孩子。
tree.h
/*===============================================
* 文件名称:tree.h
* 创 建 者:cxy
* 创建日期:2024年01月23日
* 描 述:
================================================*/
#ifndef _TREE_H
#define _TREE_H#include <stdio.h>
#include <stdlib.h>typedef struct node{int data;struct node *lchild;struct node *rchild;
}Tree,*Ptree;Ptree init(int i,int sum); //i为节点编号,sum为总数
int preorder(Ptree root); //先序遍历
int inorder(Ptree root); //中序遍历
int postorder(Ptree root); //后序遍历#endif
tree.c
/*===============================================
* 文件名称:tree.c
* 创 建 者:cxy
* 创建日期:2024年01月23日
* 描 述:
================================================*/
#include "tree.h"Ptree init(int i,int sum)
{Ptree root = malloc(sizeof(Tree));root->data = i;if(2*i <= sum){root->lchild = init(2*i,sum);}else{root->lchild = NULL;}if(2*i+1 <= sum){root->rchild = init(2*i+1,sum);}else{root->rchild = NULL;}return root;
}int preorder(Ptree root)
{if(NULL == root)return 0;printf("%d ",root->data);preorder(root->lchild);preorder(root->rchild);return 0;
}int inorder(Ptree root)
{if(NULL == root)return 0;inorder(root->lchild);printf("%d ",root->data);inorder(root->rchild);return 0;
}int postorder(Ptree root)
{if(NULL == root)return 0;postorder(root->lchild);postorder(root->rchild);printf("%d ",root->data);return 0;
}
main.c
/*===============================================
* 文件名称:main.c
* 创 建 者:cxy
* 创建日期:2024年01月23日
* 描 述:
================================================*/
#include "tree.h"int main(int argc, char *argv[])
{ Ptree root;root = init(1,9);printf("-----先序遍历-----\n");preorder(root);puts("");printf("-----中序遍历-----\n");inorder(root);puts("");printf("-----后序遍历-----\n");postorder(root);puts("");return 0;
}
结果