树与二叉树之三--二叉树的遍历

  二叉树的遍历包括:先序遍历、中序遍历和后序遍历。其实现的基本思想就是利用递归的方式,以先序遍历为例,首先访问根结点,然后依次分别对它的左子树和右子树进行先序遍历。接下来直接贴实现代码,假设二叉树的结点中存储的是一个整型数据,对二叉树分别进行先、中、后序遍历,依次打印出不同遍历方式下得到的整数序列。

  • 二叉树结点的定义
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;
	}
}

以上就是一个二叉树的建立、遍历以及销毁的过程。

原文地址:https://www.cnblogs.com/Bill-LHR/p/6756378.html