/*
树的定义:
由一个或多个(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; }