按之字形顺序打印二叉树如何实现?代码实现和思路分享

大家对于二叉树应该都很了解,那么按照之字形顺序打印二叉树应该怎样实现呢?下面一起来看看相关的代码实现和思路分享吧。

题目:

实现一个函数按照之字形打印二叉树。

也就是第1行依照从左至右的顺序打印,第2行依照从右到左的顺序打印,第3行依照从左至右的顺序打印,其它的行皆以此类推。

思路1:

代码实现:

public static ArrayList < ArrayList < Integer >> Print(TreeNode pRoot)
{
    int layer = 1;
    //s1存奇数层节点
    Stack < TreeNode > s1 = new Stack < TreeNode > ();
    s1.push(pRoot);
    //s2存偶数层节点
    Stack < TreeNode > s2 = new Stack < TreeNode > ();
    ArrayList < ArrayList < Integer >> list = new ArrayList < ArrayList < Integer >> ();
    while (!s1.empty() || !s2.empty())
    {
        if (layer % 2 != 0)
        {
            ArrayList < Integer > temp = new ArrayList < Integer > ();
            while (!s1.empty())
            {
                TreeNode node = s1.pop();
                if (node != null)
                {
                    temp.add(node.val);
                    System.out.print(node.val + " ");
                    s2.push(node.left);
                    s2.push(node.right);
                }
            }
            if (!temp.isEmpty())
            {
                list.add(temp);
                layer++;
                System.out.println();
            }
        }
        else
        {
            ArrayList < Integer > temp = new ArrayList < Integer > ();
            while (!s2.empty())
            {
                TreeNode node = s2.pop();
                if (node != null)
                {
                    temp.add(node.val);
                    System.out.print(node.val + " ");
                    s1.push(node.right);
                    s1.push(node.left);
                }
            }
            if (!temp.isEmpty())
            {
                list.add(temp);
                layer++;
                System.out.println();
            }
        }
    }
    return list;
}

第一个思路是非常的清晰的,大家可以稍微的参考一下。

思路2:(思路很清晰)

一次性AC。

代码实现:

class Solution
{
    public:
        vector < vector < int > > Print(TreeNode * pRoot)
        {
            vector < vector < int >> res;
            if (pRoot == NULL)
                return res;
            queue < TreeNode * > que;
            que.push(pRoot);
            bool even = false;
            while (!que.empty())
            {
                vector < int > vec;
                const int size = que.size();
                for (int i = 0; i < size; ++i)
                {
                    TreeNode * tmp = que.front();
                    que.pop();
                    vec.push_back(tmp - > val);
                    if (tmp - > left != NULL)
                        que.push(tmp - > left);
                    if (tmp - > right != NULL)
                        que.push(tmp - > right);
                }
                if (even)
                    std::reverse(vec.begin(), vec.end());
                res.push_back(vec);
                even = !even;
            }
            return res;
        }
};


下面一起来看看第三种思路。

思路3:

代码实现:

class Solution
{
    public:
        vector < vector < int > > Print(TreeNode * pRoot)
        {
            vector < vector < int >> res;
            if (pRoot == NULL)
                return res;
            vector < TreeNode * > q1;
            vector < TreeNode * > q2;
            q1.push_back(pRoot);
            bool model = true; //ture表示方向从左向右
            while (!q1.empty())
            {
                q2 = q1;
                q1.clear();
                vector < int > row;
                while (!q2.empty())
                { //把当前层全部访问,并将孩子按一定顺序入栈
                    TreeNode * temp = q2.back();
                    q2.pop_back();
                    row.push_back(temp - > val);
                    if (model == true)
                    { //turew为从左向右
                        if (temp - > left) q1.push_back(temp - > left);
                        if (temp - > right) q1.push_back(temp - > right);
                    }
                    else
                    { //false为从右向左
                        if (temp - > right) q1.push_back(temp - > right);
                        if (temp - > left) q1.push_back(temp - > left);
                    }
                }
                model = !model; //变换方向
                res.push_back(row);
            }
            return res;
        }
};

以上3种关于按之字形顺序打印二叉树的代码实现方式思路大家都了解了吗?更多相关Java实例,请继续关注本站了解吧!