Binary Tree Inorder Traversal
问题描述:
给定一棵二叉树,返回它的中序遍历。
解题思路:
中序遍历的法则: 遍历左子树 访问当前元素 遍历右子树 根据中序遍历的法则,可以得到相应的算法: 声明一个栈用来存储还没遍历到的节点,而且从栈顶到栈底是向根部回推的一个过程 声明一个遍历指针ptr并赋值为root 对于每个节点 if有左子树 将该节点压入栈 ptr更新为该节点的左子树 else 无左子树 访问该节点值 if有右子树 ptr更新为该节点的右子树 else 无右子树(是树叶) 如果栈空 则结束 while栈不空 访问栈顶元素并判断有无右子树 if无右子树 则弹出栈顶元素 else 跳出循环 if栈空 则结束 else ptr更新为栈顶元素的右子树并弹出栈顶元素源代码如下:
class Solution {
public: vector<int> inorderTraversal(TreeNode* root) { vector<int> result; stack<TreeNode* > stk; TreeNode* ptr=root; if(ptr==NULL) return result; while(true) { if(ptr->left!=NULL) { stk.push(ptr); ptr=ptr->left; } else if(ptr->right!=NULL) { result.push_back(ptr->val); ptr=ptr->right; } else { result.push_back(ptr->val); if(stk.empty()) break; else { while(!stk.empty()) { result.push_back(stk.top()->val); if(stk.top()->right==NULL) stk.pop(); else break; } if(stk.empty()) break; else { ptr=stk.top()->right; stk.pop(); } } } } return result; } };