Note:后序遍历在表达式上的应用
Note:
递归的实现方式里,函数的返回值需要为void类型,否则没法进行。
所以我们需要设定一个help函数来完成递归。
/**
* Definition for a binary tree node.
* 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> nodes;
? ? ? ?helper( root, nodes);
? ? ? ?return nodes;
?
? }
? ?void helper(TreeNode *pnode , vector<int> &node_ids)
? {
? ? ? ?if( pnode == NULL)
? ? ? {
? ? ? ? ? ?std::cout ?<< " The tree is null ! " << std::endl;
? ? ? }
? ? ? ?else
? ? ? {
? ? ? ? ? ?if(pnode != NULL)
? ? ? ? ? ? ? ?helper(pnode->left,node_ids);
? ? ? ? ? ?if(pnode != NULL)
? ? ? ? ? ? ? ?helper(pnode->right,node_ids);
? ? ? ? ? ?node_ids.push_back(pnode->val);
? ? ? } ?
? }
};
/**
* Definition for a binary tree node.
* 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> nodes;
? ? ? ?helper( root, nodes);
? ? ? ?return nodes;
?
? }
? ?void helper(TreeNode *pnode , vector<int> &node_ids)
? {
? ? ? ?if( pnode == NULL)
? ? ? {
? ? ? ? ? ?std::cout ?<< " The tree is null ! " << std::endl;
? ? ? }
? ? ? ?else
? ? ? {
? ? ? ? ? ?node_ids.push_back(pnode->val);
? ? ? ? ? ?if(pnode != NULL)
? ? ? ? ? ? ? ?helper(pnode->left,node_ids);
? ? ? ? ? ?if(pnode != NULL)
? ? ? ? ? ? ? ?helper(pnode->right,node_ids);
? ? ? } ?
? }
};
/**
* Definition for a binary tree node.
* struct TreeNode {
* ? ? int val;
* ? ? TreeNode *left;
* ? ? TreeNode *right;
* ? ? TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
? ?vector<int> inorderTraversal(TreeNode* root ) {
? ? ? ?vector<int> nodes;
? ? ? ?helper( root, nodes);
? ? ? ?return nodes;
?
? }
? ?void helper(TreeNode *pnode , vector<int> &node_ids)
? {
? ? ? ?if( pnode == NULL)
? ? ? {
? ? ? ? ? ?std::cout ?<< " The tree is null ! " << std::endl;
? ? ? }
? ? ? ?else
? ? ? {
? ? ? ? ? ?if(pnode != NULL)
? ? ? ? ? ? ? ?helper(pnode->left,node_ids);
? ? ? ? ? ?node_ids.push_back(pnode->val);
? ? ? ? ? ?if(pnode != NULL)
? ? ? ? ? ? ? ?helper(pnode->right,node_ids);
? ? ? } ?
? }
};
用递归方式实现的问题都可以用非递归方法实现。
递归的本质就是利用函数栈来保存信息。
用自己申请的数据结构来代替函数栈,可以实现同样的功能。
/**
* Definition for a binary tree node.
* 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> orders;
? ? ? ?stack<TreeNode*> nodes;
? ? ? ?TreeNode* tmp;
? ? ? ?
? ? ? ?if (root == NULL)
? ? ? {
? ? ? ? ? ?std::cerr << "The Tree is NULL !!!" << std::endl;
? ? ? }
? ? ? ?else
? ? ? {
? ? ? ? ? ?nodes.push(root);
? ? ? ? ? ?while(nodes.empty()==0)
? ? ? ? ? {
? ? ? ? ? ? ? ?tmp = ?nodes.top();
? ? ? ? ? ? ? ?nodes.pop();
? ? ? ? ? ? ? ?orders.push_back(tmp->val);
? ? ? ? ? ? ? ?if(tmp->right!=NULL)
? ? ? ? ? ? ? ? ? ?nodes.push(tmp->right);
? ? ? ? ? ? ? ?if(tmp->left!= NULL)
? ? ? ? ? ? ? ? ? ?nodes.push(tmp->left);
? ? ? ? ? } ? ? ? ?
? ? ? }
? ? ? ?return orders;
? }
};
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> inorder;
TreeNode* cur = root;
if(root != NULL)
{
stack<TreeNode*> kk ;
while( !kk.empty() || cur != NULL)
{
if(cur != NULL)
{
kk.push(cur);
cur = cur->left;
}
else
{
cur = kk.top();
kk.pop();
inorder.push_back(cur->val);
cur = cur->right;
}
}
}
return inorder;
}
};
其实就是逐层遍历树的结构
广度优先搜索一种广泛运用在树或图这类数据结构中,遍历或搜索的算法。
该算法从一个根节点开始,首先访问节点本身。
然后遍历它的相邻节点,其次遍历它的二级邻节点、三级邻节点,以此类推。
当我们在树中进行广度优先搜索时,我们访问的节点的顺序是按照层序遍历顺序的。
核心:
就是 while 循环里面套一个 for 循环。
.
.
.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root == NULL)
return ans;
queue<TreeNode*> q;
q.push(root);
while( !q.empty() )
{
int num = q.size();
vector<int> cur;
for (int i = 0 ; i < num; i++)
{
TreeNode* pnode = q.front();
q.pop();
if (pnode->left != NULL)
q.push(pnode->left);
if (pnode->right != NULL)
q.push(pnode->right);
cur.push_back(pnode->val);
}
ans.push_back(cur);
}
return ans;
}
};
原文:https://www.cnblogs.com/jiangxinyu1/p/12284959.html