2013-03-17---二叉树递归,非递归实现(附代码)深度,叶子节点数量,逐行打印二叉树

昨天晚上没有发文章,说来话长啊,昨天不知道是csdn的问题,还是我的问题,我访问了半天,访问不上网站啊,后来12点多了,就睡了。上一篇文章说到了二叉树的先序,中序,后序遍历问题,这次还是说的简单的一点,说计算二叉树的深度,和叶子节点数量

int ceng(Node *pRoot)	//计算层数,递归实现
{
	int left = 0;
	int right = 0;
	int res = 0;
	if (pRoot == NULL)
	{
		return 0;
	}
	if (pRoot->pLeft != NULL)
	{
		left = ceng(pRoot->pLeft);
	}
	if (pRoot->pRight != NULL)
	{
		right = ceng(pRoot->pRight);
	}
	res = left > right ? left : right;
	return res + 1;
}


class CengNode
{
public:
	int n = 0;
	Node *p = NULL;
	CengNode(int now, Node *p) :n(now), p(p)
	{

	}
};

int cengstack(Node *pRoot)	//计算深度,非递归实现
{
	stack<CengNode> mystack;
	Node *pnow = pRoot;
	mystack.push(CengNode(1, pRoot));
	int res = 0;
	while (false == mystack.empty())
	{
		CengNode now = mystack.top();
		mystack.pop();
		if (now.n > res)
		{
			res = now.n;
		}
		if (now.p->pRight != NULL)
		{
			mystack.push(CengNode(now.n + 1, now.p->pRight));
		}
		if (now.p->pLeft != NULL)
		{
			mystack.push(CengNode(now.n + 1, now.p->pLeft));
		}
	}
	return res;
}



int getyenum(Node *pRoot)	//计算叶子节点数,递归实现
{
	int left = 0;
	int right = 0;

	if (pRoot == nullptr)
	{
		return 0;
	}
	if (pRoot->pLeft == NULL && pRoot->pRight == NULL)
	{
		return 1;
	}
	if (pRoot->pLeft != nullptr)
	{
		left = getyenum(pRoot->pLeft);
	}
	if (pRoot->pRight != nullptr)
	{
		right = getyenum(pRoot->pRight);
	}
	return left + right;
}

int getyenumstack(Node *pRoot)//计算叶子节点数,非递归实现
{
	stack<Node *> mystack;
	Node *pnow = NULL;
	mystack.push(pRoot);
	int res = 0;
	while (false == mystack.empty())
	{
		pnow = mystack.top();
		mystack.pop();
		if (pnow != NULL)
		{
			if (pnow->pLeft == NULL && pnow->pRight == NULL)
			{
				res += 1;
			}
			else
			{
				if (pnow->pRight != NULL)
				{
					mystack.push(pnow->pRight);
				}
				if (pnow->pLeft != NULL)
				{
					mystack.push(pnow->pLeft);
				}
			}
		}
	}
	return res;
}


void hengprintqueue(Node *pRoot)	//逐行打印,非递归,队列实现
{
	queue<Node *> myqueue;
	myqueue.push(pRoot);
	Node *pnow = NULL;
	while (false == myqueue.empty())
	{
		pnow = myqueue.front();
		myqueue.pop();
		if (pnow != NULL)
		{
			cout << pnow->data << " ";
			if (pnow->pLeft != NULL)
			{
				myqueue.push(pnow->pLeft);
			}
			if (pnow->pRight != NULL)
			{
				myqueue.push(pnow->pRight);
			}
		}
	}
}

void hengprintstack(Node *pRoot)	//逐行打印,非递归,栈实现
{
	stack<Node *> mystack;
	stack<Node *> mystacktemp;
	mystack.push(pRoot);
	Node *pnow = NULL;
	bool flag = true;
	while (false == mystacktemp.empty() || false == mystack.empty()) {
		if(false == mystack.empty())
		{
			pnow = mystack.top();
			mystack.pop();
			if (pnow != NULL)
			{
				cout << pnow->data << " ";
				mystacktemp.push(pnow->pLeft);
				mystacktemp.push(pnow->pRight);
			}

		}
		else
		{
			while (false == mystacktemp.empty())
			{
				mystack.push(mystacktemp.top());
				mystacktemp.pop();
			}
		}
	}

}

自己感觉这些代码,还算是二叉树里面比较简单的吧,具体的就不解释了,相信大家还是都能理解的,递归的好理解,栈就是我们手动模拟递归的过程啊。

说说这几天的感受,说好的15号结束c++啊,今天都17号了,其实这个东西不能急功近利啊,真的是只能慢慢来,从上个月18号开始的c++吧,不知不觉过了1个月了,其实现在感觉c++的语言还好吧,主要是基本功,数据结构,还有设计模式,因为以前用别的语言做过打的项目,所以其实设计模式还好,主要就是数据结构,树和图,还有n种排序算法,所以这几天真的发现越学东西越多啊,总之,这个坎是要迈过去的,我要在6月之前尽力搞啊,时间也算是够长的,具体的看自己了。

基础不牢地动山摇,如果想要好的offer,好的工作就要努力啊,加油吧。明天还要调整一下学习计划,复习一下,我们一起搞,搞cocos2dx,搞数据结构,搞设计模式,

我去刷牙了,一会儿就睡觉了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值