[LeetCode][94,144,145]Binary Tree (Pre/In/Post)order Traversal

来源:互联网 发布:域名续费多少钱 编辑:程序博客网 时间:2024/06/02 03:44

Description:

Given a binary tree, return the (Pre/In/Post)order traversal of its nodes' values.

For example:
Given binary tree [1,null,2,3],

   1    \     2    /   3

return [1,2,3]. for Preorder.

return [1,3,2]. for Inorder.

return [3,2,1]. for Postorder.

Note: Recursive solution is trivial, could you do it iteratively?

———————————————————————————————————————————————————

Solution:

经典问题:使用非递归方法对二叉树进行先序、中序、后序遍历。

思路:都需要借助数据结构——栈(Stack)来实现。根据每个遍历的特性:先序遍历先输出根节点,然后左子树,最后右子树;中序遍历先输出左子树,然后根节点,最后右子树;后序遍历先输出左子树,然后右子树,最后根节点;我们可以得到代码设计的主要思路。


其中一些细节值得关注的是:

1.先序遍历和中序遍历算法相差无几,只在何时输出根有所变化,而且它们都没有将根重新压回栈中;

2.后序遍历相对麻烦,在不修改二叉树节点结构,或消耗大量空间的前提下,需要一个记录上一次访问节点的指针,这个指针是在判断是否应该输出根时使用,若根的右孩子存在而且指针没有指向这个右孩子,则需要将根重新压入栈中;若这个指针指向了根的右孩子或者根的右孩子不存在,则说明已经访问过右孩子了或者不需要访问,则此时应该输出根而不应该重新压入栈中,而且应该更新记录指针指向当前根节点。

以上就是使用非递归方法遍历二叉树的关键点。


先序:

/** * 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> preOrder;        if (root == NULL)            return preOrder;        stack<TreeNode*> s;        TreeNode* temp = root;        while (!s.empty() || temp) {            if (temp) {                preOrder.push_back(temp->val);                s.push(temp);                temp = temp->left;            } else {                temp = s.top();                s.pop();                temp = temp->right;            }        }        return preOrder;    }};


中序:

/** * 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> inOrder;        if (root == NULL)            return inOrder;        stack<TreeNode*> s;        TreeNode* temp = root;        while (!s.empty() || temp) {            if (temp) {                s.push(temp);                temp = temp->left;            } else {                temp = s.top();                s.pop();                inOrder.push_back(temp->val);                temp = temp->right;            }        }        return inOrder;    }};


后序:

/** * 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> postOrder;        if (root == NULL)            return postOrder;        stack<TreeNode*> s;        // 记录上一个输出的根节点        TreeNode* lastNode = NULL;        TreeNode* temp = root;        while (temp) {            s.push(temp);            temp = temp->left;        }        while (!s.empty()) {            temp = s.top();            s.pop();            // 右子树为空 或 已访问完右子树            if (temp->right == NULL || temp->right == lastNode) {                postOrder.push_back(temp->val);                lastNode = temp;            } else {                s.push(temp);                temp = temp->right;                while (temp) {                    s.push(temp);                    temp = temp->left;                }            }        }        return postOrder;    }};


阅读全文
0 0
原创粉丝点击