二叉树基本操作方法的递归调用实现
Posted 码上夏雨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树基本操作方法的递归调用实现相关的知识,希望对你有一定的参考价值。
二叉树基本操作方法的递归调用实现
遍历二叉树
前序遍历
template<class T>
void BinaryTree<T>::preOrder(BinTreeNode<T>* p, void(*visit)(BinTreeNode<T>* p))
{
if (p != NULL) { //递归结束条件
visit(p);
preOrder(p->leftChild, visit);
preOrder(p->rightChild, visit);
}
}
中序遍历
template<class T>
void BinaryTree<T>::inOrder(BinTreeNode<T>* p, void(*visit)(BinTreeNode<T>* p))
{
if (p != NULL) { //递归结束条件
inOrder(p->leftChild, visit);
visit(p);
inOrder(p->rightChild, visit);
}
}
后序遍历
template<class T>
void BinaryTree<T>::postOrder(BinTreeNode<T>* p, void(*visit)(BinTreeNode<T>* p))
{
if (p != NULL) { //递归结束条件
postOrder(p->leftChild, visit);
postOrder(p->rightChild, visit);
visit(p);
}
}
层序遍历
层序遍历的实现一般是借助队列来实现的,每次让队列内当前存在的节点依次出队,再让他们的孩子节点进入节点,由此来实现层序遍历.
void BinaryTree<T>::levelOrder(void(*visit)(BinTreeNode<T>* p))
{
queue<BinTreeNode<T>*> myQueue;
BinTreeNode<T>* p = root;
myQueue.push(p);
while (!myQueue.empty())
{
p = myQueue.front();
myQueue.pop();
visit(p);
if (p->leftChild != NULL)
myQueue.push(p->leftChild);
if (p->rightChild != NULL)
myQueue.push(p->rightChild);
}
}
统计二叉树的高度
int BinaryTree<T>::Height(BinTreeNode<T>* subTree)
{
if (subTree == NULL)
return 0;
int left_height = Height(subTree->leftChild);
int right_height = Height(subTree->rightChild);
return (left_height > right_height) ? (left_height + 1) : (right_height + 1);
}
统计结点的个数
template<class T>
int BinaryTree<T>::Size(BinTreeNode<T>* subTree)const
{
if (subTree == NULL)
return 0;
return 1 + Size(subTree->leftChild) + Size(subTree->rightChild);
}
删除二叉树的所有节点
template<class T>
void BinaryTree<T>::destroy(BinTreeNode<T>*& subTree)
{
//如果subTree不为空,则递归删除其左右子树
if (subTree != NULL) {
destroy(subTree->leftChild);
destroy(subTree->rightChild);
delete subTree;
}
}
交换二叉树的孩子节点
template<class T>
void BinaryTree<T>::exchangeChild(BinTreeNode<T>* p)
{
if (p->leftChild != NULL)
exchangeChild(p->leftChild);
if (p->rightChild != NULL)
exchangeChild(p->rightChild);
BinTreeNode<T>* temp = p->leftChild;
p->leftChild = p->rightChild;
p->rightChild = temp;
}
以上是关于二叉树基本操作方法的递归调用实现的主要内容,如果未能解决你的问题,请参考以下文章
两万字硬核解析树与二叉树所有基本操作(包含堆,链式二叉树基本操作及测试代码,和递归函数的书写方法)