二叉树的中序遍历
1.递归的方法,这个比较简单。
2.迭代的方法,迭代主体一定要构思好,不然就可能写的非常复杂。首先迭代维护一个指针,指向当前节点,如果节点不为空,则节点入栈,指针指向该节点的左子树。如果节点为空,则节点指向栈顶节点的右子树,再将栈顶节点弹出………… 栈空则中序遍历完成。
将二叉树节点数值按中序遍历存入向量中:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res; //用于存放结果的向量
stack<TreeNode*> s; //存放节点的栈
TreeNode *curr; //指向当前树节点的指针
curr = root; //指针指向根节点
while (curr != NULL || !s.empty()) {
if (curr != NULL) {
s.push(curr);
curr = curr->left;
} else {
res.push_back(s.top()->val);
curr = s.top()->right;
s.pop();
}
}
return res;
}
以上两种方法都属于DFS,只是使用的栈不同。
1.递归使用的是隐式栈,因为调用函数时函数会入栈(系统栈),等到返回时出栈。
2.迭代法使用的是显式栈,程序中需要声明一个栈用于存放节点。