traverse binary tree
16 Nov 2020
2 min read
二叉树的遍历
广度优先遍历
template <class T>
void BinaryTree<T>::levelOrder(BinaryTreeNode<T> *root)
{
using std::queue;
queue<BinaryTreeNode<T> *> nodeQueue;
BinaryTreeNode<T> *pointer = root;
if (pointer)
nodeQueue.push(pointer);
while (!nodeQueue.empty())
{
pointer = nodeQueue.front();
visit(pointer);
nodeQueue.pop();
if (pointer->leftChild)
nodeQueue.push(pointer->leftChild);
if (pointer->rightChild)
nodeQueue.push(pointer->rightChild);
}
}
深度优先遍历
递归算法
// preorder
template <class T>
void BinaryTree<T>::preOrder(BinaryTreeNode<T> *root)
{
if (root != nullptr)
{
visit(root);
preOrder(root->leftChild);
preOrder(root->rightChild);
}
}
// inOrder
template <class T>
void BinaryTree<T>::inOrder(BinaryTreeNode<T> *root)
{
if (root != nullptr)
{
inOrder(root->leftChild);
visit(root);
inOrder(root->rightChild);
}
}
// postOrder
template <class T>
void BinaryTree<T>::postOrder(BinaryTreeNode<T> *root)
{
if (root != nullptr)
{
postOrder(root->leftChild);
postOrder(root->rightChild);
visit(root);
}
}
非递归算法
前序遍历
template <class T>
void BinaryTree<T>::PreOrderWithoutRecusion(BinaryTreeNode<T> *root)
{
using std::stack;
stack<BinaryTreeNode<T> *> nodeStack;
BinaryTreeNode<T> *pointer = root;
while (!nodeStack.empty() || pointer)
{
if (pointer)
{
visit(pointer);
if (pointer->rightChild)
nodeStack.push(pointer->rightChild);
pointer = pointer->leftChild;
}
else
{
pointer = nodeStack.top();
nodeStack.pop();
}
}
}
中序遍历
template <class T
void BinaryTree<T>::InOrderWithoutRecursion(BinaryTreeNode<T> *root)
{
using std::stack;
stack<BinaryTreeNode<T> *> nodeStack;
BinaryTreeNode<T> *pointer = root;
while (!nodeStack.empty() || pointer)
{
if (pointer)
{
nodeStack.posh(pointer);
pointer = pointer->leftChild;
}
else
{
pointer = nodeStack.top();
visit(pointer);
pointer = pointer->rightChild;
nodeStack.pop();
}
}
}
后续遍历
template