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。