二叉树基本操作方法的递归调用实现

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;
}

以上是关于二叉树基本操作方法的递归调用实现的主要内容,如果未能解决你的问题,请参考以下文章

两万字硬核解析树与二叉树所有基本操作(包含堆,链式二叉树基本操作及测试代码,和递归函数的书写方法)

二叉树二叉树基本操作通用接口

转 二叉树之Java实现二叉树基本操作

数据结构与算法(周鹏-未出版)-第六章 树-6.3 二叉树基本操作的实现

二叉搜索树基本操作实现

C站万字详解二叉树基本操作演示程序(附图)