二叉树四种遍历方法(非递归)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

//层次遍历 leetcode 102
//思路:把一层节点加入队列中,让后遍历这层节点的同时在队列中加入该节点的左右孩子节点
vector<int> layerTravel(TreeNode* root){ vector<int> res; if (root == NULL)return res; queue<TreeNode*> q; q.push(root); while (!q.empty()){ //计算当前队列中含有多少元素 int size = q.size(); //从头部依次取出size个元素 for (int i = 0; i < size; i++){ root = q.front(); q.pop(); res.push_back(root->val); //将下一层的元素塞入队列 if (root->left)q.push(root->left); if (root->right)q.push(root->right); } } return res; } //先序遍历 leetcode 144
//思路:1.往左走到底,在往左走的过程中遍历经过的节点并压入一个栈中。
    2.取出栈顶节点,压入该节点的右孩子节点,回到1。
vector<int> preOrderTravel(TreeNode* root){ vector<int> res; if (root == NULL)return res; stack<TreeNode*> s; while (root || !s.empty()){ while (root){ res.push_back(root->val); s.push(root); root = root->left; } root = s.top(); s.pop(); root = root->right; } return res; } //中序遍历,leetcode 94
//思路:1.往左走到底,在往左走的过程中将经过的节点压入一个栈中。
    2.取出栈顶节点,遍历该节点,压入该节点的右孩子节点,回到1。
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root == NULL)
            return res;
        stack<TreeNode *> st;
        st.push(root);
        TreeNode *p = root;
        while(!st.empty())
        {
            while(p->left)
            {
                st.push(p->left);
                p = p->left;
            }
            while(!st.empty())
            {
                p = st.top();
                st.pop();
                res.push_back(p->val);
                if(p->right)
                {
                    p = p->right;
                    st.push(p);
                    break;
                }
            }
        }
        return res;
    }
};

//后续遍历 leetcode 145
vector<int> postOrderTravel(TreeNode* root){ vector<int> res; if (root == NULL)return res; stack<TreeNode*> s; s.push(root); TreeNode* head = root; while (!s.empty()){ TreeNode* t = s.top(); if (!t->left&&!t->right || t->left == head || t->right == head){ res.push_back(t->val); s.pop(); head = t; } else{ if (t->right)s.push(t->right); if (t->left)s.push(t->left); } } return res; } int main(){ return 0; }

 python实现

import queue

class Node(object):
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

'''
层次遍历:先把当前层节点加入队列,然后逐个弹出当前层的节点,
在弹出的过程中遍历这个节点并向队列压入该节点的孩子节点
'''
def layer_travel(root, result):
    if root == None:
        return
    q = queue.Queue()
    q.put(root)
    while not q.empty():
        size = q.qsize()
        for _ in range(size):
            p = q.get()
            result.append(p.value)
            if p.left != None:
                q.put(p.left)
            if p.right != None:
                q.put(p.right)

'''
先序遍历:1.往左走到底,在往左走的过程中遍历经过的节点并压入一个栈中。
     2.取出栈顶节点,压入该节点的右孩子节点,回到1。
'''
def preorder_travel(root, result):
    if root == None:
        return
    p = root
    stack = []
    stack.append(p)
    result.append(p.value)
    while len(stack) > 0:
        while p.left != None:
            p = p.left
            stack.append(p)
            result.append(p.value)
        while len(stack) > 0:
            p = stack.pop()
            if p.right != None:
                p = p.right
                stack.append(p)
                result.append(p.value)
                break

'''
中序遍历:1.往左走到底,在往左走的过程中将经过的节点压入一个栈中。
      2.取出栈顶节点,遍历该节点,压入该节点的右孩子节点,回到1。
'''
def inorder_travel(root, result):
    if root == None:
        return
    p = root
    stack = []
    stack.append(p)
    result.append(p.value)
    while len(stack) > 0:
        while p.left != None:
            p = p.left
            stack.append(p)
        while len(stack) > 0:
            p = stack.pop()
            result.append(p.value)
            if p.right != None:
                p = p.right
                stack.append(p)
                break

'''
后序遍历
'''
def postorder_travel(root, result):
    if root == None:
        return
    head = root #存储上一步被弹出的节点
    stack = []
    stack.append(head)
    while len(stack) > 0:
        p = stack[-1]
        #当该节点没有儿子节点或儿子节点已经被弹出时,弹出该节点
        if (p.left == None and p.right == None) or\
            p.left == head or p.right == head:
            result.append(p.value)
            head = p
            stack.pop()
        else:
            if p.right != None:
                stack.append(p.right)
            if p.left != None:
                stack.append(p.left)

 

posted @ 2019-06-06 09:27  xd_xumaomao  阅读(272)  评论(0编辑  收藏  举报