标签:root roo void 输出 vector ret top public ack
题目描述:
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
数据结构定义:
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };
算法思想:
/*一、递归 效率较低,了解即可。 二叉树的中序遍历规则: 1. 遍历左子树; 2. 访问根结点; 3. 遍历右子树 */ class Solution { private: void rec(TreeNode* root,vector<int> &ret){ if(root != NULL){ rec(root->left,ret); ret.push_back(root->val); rec(root->right,ret); } } public: vector<int> inorderTraversal(TreeNode* root) { vector<int> ret; rec(root,ret); return ret; } };
/* 二、迭代 效率较高,重点掌握。利用栈实现。思路是从根节点开始,先将根节点压入栈,然后再将其所有左子结点压入栈,然后取出栈顶节点,保存节点值,再将当前指针移到其右子节点上,若存在右子节点,则在下次循环时又可将其所有左子结点压入栈中。这样就保证了访问顺序为左-根-右。 */ class Solution { public: vector<int> inorderTraversal(TreeNode *root) { vector<int> res; stack<TreeNode*> s; TreeNode *p = root; while (p || !s.empty()) { while (p) { s.push(p); //将根节点入栈 p = p->left; //转到左子树 } p = s.top(); //取出根节点 s.pop(); res.push_back(p->val); p = p->right; //转到右子树,注意这里p已经变化(取根节点时重新赋值了) } return res; } };
分析总结:
标签:root roo void 输出 vector ret top public ack
原文地址:https://www.cnblogs.com/parzulpan/p/9920765.html