C++中二叉树的非递归遍历方法3-1

1 二叉树简介

树是一种数学上的抽象,在算法的设计与分析中起到一个中心作用。树是有n个节点的有限集合。二叉树是树的一种特殊形式,这种树的每个节点最多有2个子节点。

2 二叉树的遍历方法

二叉树的遍历分为前序遍历、中序遍历、后序遍历和层序遍历四种。

2.1 前序遍历

前序遍历的输出顺序是根节点、左子树、右子树。

2.2 中序遍历

中序遍历的输出顺序是左子树、根节点、右子树。

2.3 后序遍历

后序遍历的输出顺序是左子树、右子树、根节点。

2.4 层序遍历

层序遍历的输出顺序是从根节点开始,一层一层横向遍历各个节点。

其中,前序遍历、中序遍历、后序遍历属于深度优先遍历;层序遍历属于广度优先遍历。

3 代码实现二叉树创建

3.1 定义树的节点

struct TreeNode {

    int data;

    TreeNode* leftChild;

    TreeNode* rightChild;

};

其中,data表示该节点的值;leftChild和rightChild是节点的指针,分别表示该节点的左子节点和右子节点。

3.2 创建节点

自定义创建节点的函数createTreeNode()。

TreeNode* createTreeNode(int data)

{

    TreeNode* treenode = new TreeNode();

    treenode->data = data;

    treenode->leftChild = nullptr;

    treenode->rightChild = nullptr;

    return treenode;

}

其中,createTreeNode()的参数data表示创建节点的值,该函数的返回值是创建节点的指针。在createTreeNode()的参数中,首先通过 TreeNode的构造函数在内存中分配空间,接下来设置该节点的data、leftChild和rightChild成员变量,其中,将data设置为指定值;leftChild和rightChild设置为nullptr,即空指针,最后返回创建好的节点的指针。

3.3 关联节点

自定义关联节点的函数connectTreeNode(),将指定节点与其左右子节点关联。

bool connectTreeNode(TreeNode* parent, TreeNode* leftChild, TreeNode* rightChild)

{

    if (parent != nullptr)

    {

        parent->leftChild = leftChild;

        parent->rightChild = rightChild;

        return true;

    }

    return false;

}

其中,connectTreeNode()函数的参数parent表示指定的父节点;leftChild和rightChild分别表示与父节点关联的左右子节点。在函数中,当父节点不为空时,将其leftChild和rightChild的成员变量进行赋值。如果关联成功,connectTreeNode()函数返回true,否则返回false。

3.4 创建二叉树

要创建如图1所示的二叉树,其代码如下所示。

图1 要创建的二叉树

3.4.1 定义节点

从图1中可以看出,该二叉树包含6个节点。

typedef TreeNode* pTreeNode;

pTreeNode treenode1, treenode2, treenode3, treenode4, treenode5, treenode6;

3.4.2 创建节点

treenode1 = createTreeNode(1);

treenode2 = createTreeNode(2);

treenode3 = createTreeNode(3);

treenode4 = createTreeNode(4);

treenode5 = createTreeNode(5);

treenode6 = createTreeNode(6);

3.4.3 关联节点

connectTreeNode(treenode1, treenode2, treenode3);

connectTreeNode(treenode2, treenode4, treenode5);

connectTreeNode(treenode3, nullptr, treenode6);

从图1中可以看出,节点1的左右子节点分别是节点2和节点3;节点2的左右子节点分别是节点4和节点5;节点3的左右子节点分别是空和节点6,节点4、节点5和节点6的左右子节点均为nullptr。

猜你喜欢

转载自blog.csdn.net/hou09tian/article/details/128297065