C++模板实现二叉树基本操作

#ifndef BINARYTREE_H
#define BINARYTREE_H
#include <iostream>
#include <stack>
#include <queue>
using namespace std;


template <typename T>
struct btNode
{
    T _data;
    struct btNode *lchild;
    struct btNode *rchild;
};


template <typename T>
class binarytree
{
public:
    binarytree();
    binarytree(const T &data);
    ~binarytree();

    void clearBiTree(btNode<T> *r);

    void creatBiTree(const T &data);

	//前序遍历
    void preOrderTraverse_recursion(btNode<T> *r, vector<T> &array);
    void preOrderTraverse_iteration(vector<T> &array);

	//中序遍历
    void inOrderTraverse_recursion(btNode<T> *r, vector<T> &array);
    void inOrderTraverse_iteration(vector<T> &array);

	//后续遍历

    void postOrderTraverse_recursion(btNode<T> *r, vector<T> &array);
    void postOrderTraverse_iteration(vector<T> &array);

    btNode<T> *get_root();  //返回根节点
    btNode<T> *parent(const T &e); //返回当前节点的父节点,未找到则返回NULL。

	void invertBiTree(btNode<T> *r);        //面试毒瘤,翻转二叉树,递归版
	void invertBiTree_iteration(btNode<T> *r);  //迭代版

private:
    btNode<T> *_root;
};

template<typename T>
binarytree<T>::binarytree()
{
    _root = NULL;
}

template<typename T>
binarytree<T>::binarytree(const T &data)
{
    _root = new btNode<T>;
    _root->_data = data;
    _root->lchild = _root->rchild = NULL;
}

template<typename T>
binarytree<T>::~binarytree()
{
	if (_root)
	{
		clearBiTree(_root);
		_root = NULL;
	}
}

template<typename T>
void binarytree<T>::clearBiTree(btNode<T> *r)
{
   if(r)
   {
       clearBiTree(r->lchild);
       clearBiTree(r->rchild);
       delete r;
   }
}


//创建二叉树
template<typename T>
void binarytree<T>::creatBiTree(const T &data)
{
    if(_root == NULL)
    {
        _root = new btNode<T>;
        _root->_data = data;
        _root->lchild = _root->rchild = NULL;
    }
    else
    {
        btNode<T> *t = new btNode<T>;
        btNode<T> *r = _root;
        while(1)
        {
            if(data < r->_data)
            {
                if(r->lchild == NULL)
                {
                    t->_data = data;
                    t->lchild = t->rchild = NULL;
                    r->lchild = t;
                    break;
                }
                else {
                    r = r->lchild;
                }
            }
            else {
                if(r->rchild == NULL)
                {
                    t->_data = data;
                    t->lchild = t->rchild = NULL;
                    r->rchild = t;
                    break;
                }
                else {
                    r = r->rchild;
                }
            }

        }
    }
}


//先序遍历
template<typename T>
void binarytree<T>::preOrderTraverse_recursion(btNode<T> *r, vector<T> &array)
{
    if(r)
    {
        array.push_back(r->_data);
        preOrderTraverse_recursion(r->lchild, array);
        preOrderTraverse_recursion(r->rchild, array);
    }
}

template<typename T>
void binarytree<T>::preOrderTraverse_iteration(vector<T> &array)
{
    btNode<T> *r = _root;
    stack<btNode<T>*> s;
    while(r || !s.empty())
    {
        while(r)
        {
            array.push_back(r->_data);
            s.push(r);
            r = r->lchild;
        }

        if(!s.empty())
        {
            r = s.top();
            s.pop();
            r = r->rchild;
        }
    }

}


//中序遍历
template<typename T>
void binarytree<T>::inOrderTraverse_recursion(btNode<T> *r, vector<T> &array)
{
    if(r)
    {
        inOrderTraverse_recursion(r->lchild, array);
        array.push_back(r->_data);
        inOrderTraverse_recursion(r->rchild, array);
    }
}

template<typename T>
void binarytree<T>::inOrderTraverse_iteration(vector<T> &array)
{
    btNode<T> *r = _root;
    stack<btNode<T>*> s;
    while(r || !s.empty())
    {
        while(r)
        {
            s.push(r);
            r = r->lchild;
        }

        if(!s.empty())
        {
            r = s.top();
            s.pop();
            array.push_back(r->_data);
            r = r->rchild;
        }
    }
}


//后序遍历递归版
template<typename T>
void binarytree<T>::postOrderTraverse_recursion(btNode<T>* r, vector<T>& array)
{
	if (r)
	{
		postOrderTraverse_recursion(r->lchild, array);
		postOrderTraverse_recursion(r->rchild, array);
		array.push_back(r->_data);
	}
}

//后序遍历迭代版
template<typename T>
void binarytree<T>::postOrderTraverse_iteration(vector<T>& array)
{
	btNode<T> *pre = _root;
	stack<btNode<T>*> stk;
	stk.push(pre);
	while (!stk.empty())
	{
		btNode<T> *cur = stk.top();
		if ((cur->lchild == NULL && cur->rchild == NULL) || (cur->lchild == pre && cur->rchild == NULL) || cur->rchild == pre)
		{
			array.push_back(cur->_data);
			pre = cur;
			stk.pop();
		}
		else
		{			
			if (cur->rchild)
				stk.push(cur->rchild);
			if (cur->lchild)
				stk.push(cur->lchild);
		}
	}
}


//返回二叉树的根结点
template<typename T>
btNode<T> *binarytree<T>::get_root()
{
    return _root;
}

//查找当前节点的父节点
template<typename T>
btNode<T>* binarytree<T>::parent(const T & e)
{
	queue<btNode<T>*> q;
	btNode<T> *r = _root;
	if (r)
	{
		q.push(r);
		while (!q.empty())
		{
			btNode<T> *pa = q.front();
			q.pop();
			if ((pa->lchild && pa->lchild->_data == e) || (pa->rchild && pa->rchild->_data == e))
				return pa;
			else
			{
				if (pa->lchild)
					q.push(pa->lchild);
				if (pa->rchild)
					q.push(pa->rchild);
			}
		}
	}
	return NULL;
}


//返回树的高度
template<typename T>
int binarytree<T>::height(btNode<T> *r)
{
    int lH, rH, maxH;
	if (r)
	{
		lH = height(r->lchild);
		rH = height(r->rchild);
		maxH = lH > rH ? lH : rH;
		return maxH + 1;
	}
	else
		return 0;
}


//翻转二叉树递归版
template<typename T>
void binarytree<T>::invertBiTree(btNode<T>* r)
{
	if (r)
	{
		btNode<T> *t = r->lchild;
		r->lchild = r->rchild;
		r->rchild = t;

		invertBiTree(r->lchild);
		invertBiTree(r->rchild);
	}
}


//翻转二叉树迭代版
template<typename T>
void binarytree<T>::invertBiTree_iteration(btNode<T>* r)
{
	if (r)
	{
		stack<btNode<T>*> s;
		s.push(r);
		while (!s.empty())
		{
			r = s.top();
			s.pop();
			btNode<T> *t = r->lchild;
			r->lchild = r->rchild;
			r->rchild = t;

			if (r->lchild)
				s.push(r->lchild);
			if (r->rchild)
				s.push(r->rchild);
		}
	}
}





#endif // BINARYTREE_H

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你看,那是海边

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值