二叉树的遍历包括:先序遍历、中序遍历和后序遍历。其实现的基本思想就是利用递归的方式,以先序遍历为例,首先访问根结点,然后依次分别对它的左子树和右子树进行先序遍历。接下来直接贴实现代码,假设二叉树的结点中存储的是一个整型数据,对二叉树分别进行先、中、后序遍历,依次打印出不同遍历方式下得到的整数序列。
- 二叉树结点的定义
struct BinaryTreeNode{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
}
// 以下为建立和销毁一个二叉树的过程
BinaryTreeNode* CreateBinaryTreeNode(int value)
{// 创建一个新的二叉树结点
BinaryTreeNode* pNode = new BinaryTreeNode();
pNode->m_nValue = value;
pNode->m_pLeft = NULL;
pNode->m_pRight = NULL;
return pNode;
}
void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
{// 将三个二叉树结点连接起来,其中第一个为父结点,其余两个非别为左右子结点
if(pParent != NULL)
{
pParent->m_pLeft = pLeft;
pParent->m_pRight = pRight;
}
}
void DestroyTree(BinaryTreeNode* pRoot)
{// 给定一个二叉树的根结点,销毁这个二叉树
if(pRoot != NULL)
{
BinaryTreeNode* pLeft = pRoot->m_pLeft;
BinaryTreeNode* pRight = pRoot->m_pRight;
delete pRoot;
pRoot = NULL;
DestroyTree(pLeft);
DestroyTree(pRight);
}
}
- 先序遍历
void PreOrderTraverse(BinaryTreeNode* pNode)
{
if(pNode != NULL)
{
cout<<pNode->m_nValue;
PreOrderTraverse(pNode->m_pLeft);
PreOrderTraverse(pNode->m_pRight);
}
}
- 中序遍历
void InOrderTraverse(BinaryTreeNode* pNode)
{
if(pNode != NULL)
{
InOrderTraverse(pNode->m_pLeft);
cout<<pNode->m_nValue;
InOrderTraverse(pNode->m_pRight);
}
}
- 后序遍历
void PostOrderTraverse(BinaryTreeNode* pNode)
{
if(pNode != NULL)
{
PostOrderTraverse(pNode->m_pLeft);
PostOrderTraverse(pNode->m_pRight);
cout<<pNode->m_nValue;
}
}
以上就是一个二叉树的建立、遍历以及销毁的过程。
晚来天欲雪,能饮一杯无?