昨天晚上没有发文章,说来话长啊,昨天不知道是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,搞数据结构,搞设计模式,
我去刷牙了,一会儿就睡觉了。
时间: 2024-10-11 23:45:14