二叉树是一棵特殊的树,它最多有两个孩子结点,左孩子和右孩子
1.建立二叉树
二叉树一个结点指针所指向的内容包含三项,该结点的值,指向左孩子的指针和指向右孩子的指针。所以需要建立一个结构体包含这三项内容
struct BinaryTreeNode
{
BinaryTreeNode<T> *_left;//左孩子
BinaryTreeNode<T> *_right;//右孩子
T _data;
BinaryTreeNode(const T& x)
:_left(NULL)
, _right(NULL)
,_data(x)
{}
};
构造二叉树可以使用递归的方法来构造
BinaryTree(T* a, size_t n, T invalid)
{
int index = 0;
_root = CreateTree(a,n,invalid,index);
}
Node* CreateTree(T* a, int n, T invalid, int& index)
{
Node* root = NULL;
if (index < n&&a[index] != invalid)
{
root = new Node(a[index]);
root->_left = CreateTree(a, n, invalid, ++index);//用递归创建子树
root->_right = CreateTree(a, n, invalid, ++index);
}
return root;
}
2.二叉树创建后要实现一些功能
2.1 前序二叉树(递归)
先访问头结点,再访问左孩子,最后访问右孩子
该图的遍历顺序应为1 2 3 4 5 6 7
void _PrevOrder(Node* root)
{
if (root != NULL)
{
cout << root->_data << " ";//先遍历打印根节点
_PrevOrder(root->_left); //再遍历左子树
_PrevOrder(root->_right); //最后遍历右子树
}
}
2.2 前序二叉树(非递归)
void PrevOrderNonR()
{
Node* cur = _root;
stack<Node*> s;
while (cur || !s.empty())
{
while (cur)
{
s.push(cur);
cout << cur->_data << " ";
cur = cur->_left;
}
Node *top = s.top();
s.pop();
cur = top->_right;
}
cout << endl;
}
2.3 中序二叉树(递归)
遍历顺序应为3 2 4 1 7 6 5
void _InOrder(Node* root)
{