树的基本术语:
1.根节点:树的顶部节点,没有父节点。
2.叶子节点:没有子节点的节点。
3.双亲节点:某个节点的直接上一级的节点。
4.子节点:某个节点的直接下一级节点。
5.兄弟节点:即在同一双亲节点下的节点。
6.节点深度:表示从根节点到当前节点的路径长度,默认根节点的深度为 0。
7.节点高度:表示从当前节点到叶子节点的最长路径长度,叶子节点的高度为 0。
8.子树:以某个节点为根节点的子树,包含该节点及其所有的后代节点。
9.森林:若干棵不相交的树组成的集合。
二叉树的基本概念理解:
1.有且只有一个根节点。
2.除根节点以外都分为T1和T2两个子树。
3.满二叉树:即有2的n次方减1个节点的二叉树
4.完全二叉树:(自己理解为)除了最后一层,其他层次都已经到达最大层次,并且最后一层都位于树的左分支(左分支满之后在延伸右分支)。
二叉树与树的基本区别:
二叉树每个节点最多只有两个分支子树。左右两子树次序不能任意颠倒。
以下是初步编写的二叉树创建节点函数,释放二叉树函数,以及前,中,后序遍历的子函数。
#include "stdio.h"
#include "malloc.h"
typedef struct TreeNode
{
int num; // 节点存放的数值
struct TreeNode* lchild; // 左子节点指针
struct TreeNode* rchild; // 右子节点指针
} TreeNode;
TreeNode* new_node(int num) // 创建一个新节点,此处并未递归创建
{
TreeNode*node=(TreeNode*)malloc(sizeof(TreeNode));
node->num=num;
node->lchild=NULL;
node->rchild=NULL;
return node;
}
void preorder_traversal(TreeNode* root) //二叉树的前序遍历
{
if(root==NULL)
return;
printf("%d ",root->num);
preorder_traversal(root->lchild);
preorder_traversal(root->rchild);
}
void inorder_traversal(TreeNode* root) //二叉树的中序遍历
{
if(root==NULL)
return;
inorder_traversal(root->lchild);
printf("%d ", root->num);
inorder_traversal(root->rchild);
}
void Follow_up_traversal(TreeNode* root) //二叉树的后序遍历
{
if (root == NULL) {
return;
}
Follow_up_traversal(root->lchild);
Follow_up_traversal(root->rchild);
printf("%d ", root->num);
}
void release(TreeNode* root) //二叉树释放内存空间
{
if (root==NULL) //判断是否为空在进行释放
return;
release(root->lchild);
release(root->rchild);
free(root);
}