/*
树的定义:
由一个或多个(n >= 0)结点组成的有限集合T,有且仅有一个结点称为根(root),当 n>1时,其余的结点分为m(m > 0)个相互不相交的有限集合T1, T2, ..., Tm。每个集合本身又是棵树,被称作这个根的子树。
树的结构特点:
1.非线性结构,有一个直接前驱,但可能有多个直接后继(1:n)
2.树的定义具有递归行,树中还有树。
3.树可以为空,即结点个数为0.
若干术语:
根->即根结点
叶子->即终端节点(没有后继)
森林->指m棵不相交的树的集合
有序树->结点各子树从左至右有序,不能互换(左为第一)
无序树->结点各子树可互换位置。
双亲->即上层的那个结点(直接前驱)parent
孩子->即下层结点的子树(直接后继)child
兄弟->同一双亲下的同层结点(孩子之间互称兄弟)sibling
堂兄弟->即双亲位于同一层的结点(但并非同一双亲)cousin
祖先->即从根到该结点所经分支的所有结点
结点->即树的数据元素
结点的度->结点挂接的子树数(有几个直接后继就是几度)。
结点的层次->从根到该结点的层数(根结点算第一层)
终端结点->即度为0 的结点, 即叶子
分支结点->除树根以为的结点(也称为内部结点)
树的度->所有结点度中的最大值(MAX(各结点的度))
树的深度(或者高度)->指所有结点中最大的层数(Max(各结点的层次))
深度是从根结点从上往下
高度是从叶子从上往下
三种表示树的方法:
双亲表示法
struct Node
{
int data;
int parent;
};
左孩子右兄弟表示法:
孩子表示法:
struct ChildNode
{
int data;
ChildNode*;
};
*/
/*
二叉树的遍历:
遍历定义:
指按某条搜索路线遍访每个节点且不重复(又称周游)。
遍历用途:
它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。
遍历的方法:
牢记一种约定,对每个结点的查看都是"先左后右"。
限定先左后右,树的遍历有三种实现方案:
DLR LDR LRD
都要遍历到底在说
前(根)序遍历 中(根)序遍历 后(根)序遍历
DLR->先序遍历,即先根在左在右
LDR->中序遍历,即先左在根在右
LRD->后序遍历,即先左在右在根
树的定义:
由一个或多个(n >= 0)结点组成的有限集合T,有且仅有一个结点称为根(root),当 n>1时,其余的结点分为m(m > 0)个相互不相交的有限集合T1, T2, ..., Tm。每个集合本身又是棵树,被称作这个根的子树。
树的结构特点:
1.非线性结构,有一个直接前驱,但可能有多个直接后继(1:n)
2.树的定义具有递归行,树中还有树。
3.树可以为空,即结点个数为0.
若干术语:
根->即根结点
叶子->即终端节点(没有后继)
森林->指m棵不相交的树的集合
有序树->结点各子树从左至右有序,不能互换(左为第一)
无序树->结点各子树可互换位置。
双亲->即上层的那个结点(直接前驱)parent
孩子->即下层结点的子树(直接后继)child
兄弟->同一双亲下的同层结点(孩子之间互称兄弟)sibling
堂兄弟->即双亲位于同一层的结点(但并非同一双亲)cousin
祖先->即从根到该结点所经分支的所有结点
结点->即树的数据元素
结点的度->结点挂接的子树数(有几个直接后继就是几度)。
结点的层次->从根到该结点的层数(根结点算第一层)
终端结点->即度为0 的结点, 即叶子
分支结点->除树根以为的结点(也称为内部结点)
树的度->所有结点度中的最大值(MAX(各结点的度))
树的深度(或者高度)->指所有结点中最大的层数(Max(各结点的层次))
深度是从根结点从上往下
高度是从叶子从上往下
三种表示树的方法:
双亲表示法
struct Node
{
int data;
int parent;
};
左孩子右兄弟表示法:
孩子表示法:
struct ChildNode
{
int data;
ChildNode*;
};
*/
/*
二叉树的遍历:
遍历定义:
指按某条搜索路线遍访每个节点且不重复(又称周游)。
遍历用途:
它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。
遍历的方法:
牢记一种约定,对每个结点的查看都是"先左后右"。
限定先左后右,树的遍历有三种实现方案:
DLR LDR LRD
都要遍历到底在说
前(根)序遍历 中(根)序遍历 后(根)序遍历
DLR->先序遍历,即先根在左在右
LDR->中序遍历,即先左在根在右
LRD->后序遍历,即先左在右在根
*/
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
//二叉树结点
typedef struct BINARYNODE
{
char ch;
struct BINARYNODE* lchild;
struct BINARYNODE* rchild;
}BinaryNode;
//遍历二叉树
void Recursion(BinaryNode* root)
{
if(root == NULL)
{
return ;
}
printf("%c", root->ch);
//遍历左子树
Recursion(root->lchild);
//遍历右子树
Recursion(root->rchild);
}
//拷贝二叉树
BinaryNode* CopyBinaryTree(BinaryNode* root)
{
if(root == NULL)
{
return NULL;
}
//拷贝左子树
BinaryNode* lchild = CopyBinaryTree(root->lchild);
//拷贝右子树
BinaryNode* rchild = CopyBinaryTree(root->rchild);
//创建结点
BinaryNode* newnode = (BinaryNode*)malloc(sizeof(BinaryNode));
newnode->ch = root->ch;
newnode->lchild = lchild;
newnode->rchild = rchild;
return newnode;
}
//释放二叉树内存
void FreeSpaceBinaryTree(BinaryNode* root)
{
if(root == NULL)
{
return ;
}
//释放左子树
FreeSpaceBinaryTree(root->lchild);
//释放右子树
FreeSpaceBinaryTree(root->rchild);
//释放当前结点
free(root);
}
void CrestBinaryTree()
{
//创建结点
BinaryNode node1 = {'A', NULL, NULL};
BinaryNode node2 = {'B', NULL, NULL};
BinaryNode node3 = {'C', NULL, NULL};
BinaryNode node4 = {'D', NULL, NULL};
BinaryNode node5 = {'E', NULL, NULL};
BinaryNode node6 = {'F', NULL, NULL};
BinaryNode node7 = {'G', NULL, NULL};
BinaryNode node8 = {'H', NULL, NULL};
//建立结点关系
node1.lchild = &node2;
node1.rchild = &node6;
node2.rchild = &node3;
node3.lchild = &node4;
node3.rchild = &node5;
node6.rchild = &node7;
node7.lchild = &node8;
BinaryNode* root = CopyBinaryTree(&node1);
Recursion(root);
printf("\n");
FreeSpaceBinaryTree(root);
//Recursion(root);
//printf("\n");
}
int main(int argc, char *argv[])
{
CrestBinaryTree();
return 0;
}