标签:前序遍历 最短路 level pre roo top evel root end
1、给定二叉树,找到它的最小深度。最小深度是从根节点到最近叶节点的最短路径上的节点数。
class Solution { public: int run(TreeNode *root) { if(!root) return 0; queue<TreeNode*> qu; TreeNode *last; TreeNode *now; int level=1; int size; last = now = root; qu.push(root); while(qu.size()){ now = qu.front(); qu.pop(); size = qu.size(); if(now->left) qu.push(now->left); if(now->right) qu.push(now->right); if(qu.size()-size ==0) break; if(last == now){ level++; if(qu.size()) last = qu.back(); } } return level; } };
2、给定二叉树,返回其节点值的后序遍历。
例如:
给定二叉树{1,#,2,3},
1
\
2
/
3
返回[3,2,1]。
注意:递归解决方案很简单,你可以迭代地做吗?
思路:
前序遍历 根->左->右 变成 根->右->左 结果再reverse一下
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> postorderTraversal(TreeNode *root) { vector<int> res; if(!root) return res; stack<TreeNode *> st; st.push(root); while(st.size()){ TreeNode *temp = st.top(); st.pop(); res.push_back(temp->val); if(temp->left) st.push(temp->left); if(temp->right) st.push(temp->right); } reverse(res.begin(),res.end()); return res; } };
3、给定二叉树,返回其节点值的前序遍历。
例如:
给定二叉树{1,#,2,3},
1
\
2
/
3
返回[1,2,3]。
注意:递归解决方案很简单,你可以迭代地做吗?
思路:
非递归方式求前序遍历
首先找根节点的左孩子,如果有则放入开辟好的栈里,若没有则找他的右孩子,
若此时没有其右孩子,则返回它的父节点,观察其是否有右兄弟,以此类推
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int> res; if(!root) return res; stack<TreeNode*> st; TreeNode *p = root; while(!st.empty() || p!=NULL){ if(p!=NULL){ //如果有左孩子 res.push_back(p->val); //将值放入到开辟好的容器中 st.push(p); //将其放入栈中 p = p->left; //继续找左孩子 }else{ p = st.top(); //找到当前栈中的最上层的节点 st.pop(); //删除该节点 p = p->right; // 看这个节点是由由右孩子 } } return res; } };
标签:前序遍历 最短路 level pre roo top evel root end
原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/11193172.html