二叉树的前序遍历
二叉树是一种重要的数据结构,很多数据结构都是基于二叉树的衍生。
对于二叉树的前序遍历,按照“根节点-左孩子-右孩子”的顺序进行访问。二叉树的前序遍历递归算法十分简单:
1 2 3 4 5 6
| struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };
|
1 2 3 4 5 6
| void preOrder(TreeNode * root) { if(!root) return; cout << root->val << ' '; preOrder(root->left); preOrder(root->right); }
|
二叉树的前序非递归算法稍微复杂一点,其思路如下:
对于任一节点 P:
访问节点 P,并将节点 P 入栈
判断节点 P 节点的左孩子是否为空,不为空,则迭代查找左孩子,并将节点入栈,直到为空;若为空,从栈顶取出节点作为 P 节点,然后查找 P 的右孩子节点。
直到 P 为空并且栈为空,遍历结束。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| vector<int> preorderTraversal(TreeNode *root) { vector<int> result; stack<TreeNode *> ret; TreeNode * p = root; while(p != NULL || !ret.empty()) { while(p != NULL) { result.push_back(p->val); ret.push(p); p = p->left; } if(!ret.empty()) { p = ret.top(); ret.pop(); p = p->right; } } return result; }
|