web-dev-qa-db-ja.com

ジグザグ方式での二分木の印刷レベルの順序トラバーサル

レベル順トラバーサルを使用してバイナリツリーのノードを印刷する必要がありますが、スパイラル形式で印刷する必要があります。つまり、異なるレベルのノードはスパイラル形式で印刷する必要があります。

例:ツリーが次のようになっている場合:

出力は105 20 25 15 64である必要があります。

私が使用したアルゴリズムは単純で、レベル次数トラバーサルのほんのわずかなバリエーションです。変数pを取得しました。変数が1に等しい場合は、指定されたレベルで順序を左から右に出力します。-1の場合は、右から左に出力します。

void getlevel(struct node *root,int n,int p)
{
        if(root==NULL)
        return;
        if(n==0)
        {
                printf("%d ",root->info);
                return;
        }
        if(n>0)
        {
            if(p==1)
            {
                 getlevel(root->left,n-1,p);
                 getlevel(root->right,n-1,p);
            }
            if(p==-1)
            {
                 getlevel(root->right,n-1,p);
                 getlevel(root->left,n-1,p);
            }
        }
}

私は答えを得ていますが、最悪の場合の複雑さは、歪んだツリーの場合、おそらくO(n ^ 2)です。

このタスクのためのより良いアルゴリズムはありますか?..

私のプログラム全体は ここ

17
poorvank

はい。

通常のレベルの順序トラバーサルと同様のことを行うことができます。

2つのスタックを使用する必要があります

  1. 左から右に印刷するための最初のスタック
  2. 右から左に印刷するための2番目のスタック。

ルートノードから開始します。子を1つのスタックに格納します。すべての反復で、スタックの1つに1つのレベルのノードがあります。ノードを印刷し、次のレベルのノードを他のスタックにプッシュします。最終レベルに達するまで繰り返します。

時間計算量O(n)および空間計算量O(n)。

19
banarun

二分木のスパイラルレベルの順序トラバーサルの擬似コード。

//Define two stacks S1, S2

//At each level,
// S1 carries the nodes to be traversed in that level
// S2 carries the child nodes of the nodes in S1

spiralLevelOrder(root) {
    S1 = new Stack()
    S2 = new Stack()
    S1.Push(root)
    spiralLevelOrderRecursion(S1, S2, 1)
}

spiralLevelOrderRecursion(S1, S2, level) {
    while(S1 not empty) {
    node = S1.pop()
        visit(node)
        if (level is odd) {
            S2.Push(node.rightNode)
            S2.Push(node.leftNode)
        }
        else {
            S2.Push(node.leftNode)
            S2.Push(node.rightNode)
        }
    }
    if (S2 not empty)
        spiralLevelOrderRecursion(S2, S1, level+1)
}

サンプルツリー:1-(2-(4,5)、3-(5,6))形式:ルート-(左子、右子)

擬似コードの適用:

spiralLevelOrderRecursion([1]、[]、1)

S2 - [] -> [3] -> [2, 3]
visit order : 1

spiralLevelOrderRecursion([2,3]、[]、2)

S2 - [] -> [4] -> [5,4] -> [6, 5, 4] -> [7, 6, 5, 4]
visit order : 2, 3

spiralLevelOrderRecursion([7,6,5,4]、[]、3)

visit order : 7, 6, 5, 4
6
user487478

次のコードがその仕事をします:

使用言語:Java

//  Algorithm for printing nodes in Zigzag order(zigzag tree traversal)
static void zigzagTreeTraversal(Node root)
{
    int count=0,c=1,i=0;
    boolean odd=false;
    Queue<Node> queue=new LinkedList<Node>();
    Node temp = null;
    queue.add(root);
    System.out.print("Printing Tree Traversal in Zigzag form :");
    while(true)
    {
        if(queue.isEmpty())
        {
            break;
        }

        for(i=0;i<c;i++)
        {
            temp=queue.remove();
            System.out.print(", " + temp.data);
            if(odd)
            {
                if(temp.right!=null)
                {
                    queue.add(temp.right);
                    count++;
                }

                if(temp.left!=null)
                {
                    queue.add(temp.left);
                    count++;
                }

            }
            else
            {
                if(temp.left!=null)
                {
                    queue.add(temp.left);
                    count++;
                }
                if(temp.right!=null)
                {
                    queue.add(temp.right);
                    count++;
                }

            }
        }
        c=count;
        count=0;
        odd=!odd;
    }
}
1
Ashish Jain
import Java.util.ArrayList;
import Java.util.LinkedList;
import Java.util.Stack;

public class ZigZagTraversal {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BinaryTree bt = new BinaryTree();
        int[] array = {2,5,1,3,11,7,8,9,4,10,6};
        /*
         *                  2
         *                 / \
         *                /   \
         *               /     \
         *              5       1
         *             / \     / \
         *            /   \   /   \
         *           3    11 7     8
         *          / \   / \
         *         9   4 10  6 
         * 
         * */
        bt=BinaryTree.buildATree(bt, array);
        //BinaryTree.inOrderTraversal(bt);
        zigZagTraversal(llForAllNodesAtEachDepth(bt));
        zigZagDisplay(bt);
    }
    public static void zigZagDisplay(BinaryTree bt){
        Stack<BinaryTree> s = new Stack<>();
        if(s.isEmpty())
            s.Push(bt);
        boolean flag = true;
        while(!s.isEmpty()){
            Stack<BinaryTree> temp = new Stack<>();
            while(!s.isEmpty()){
                BinaryTree b = s.pop();
                System.out.print(b.data+" ");
                if(flag){
                    if(b.left!=null)
                        temp.Push(b.left);
                    if(b.right!=null)
                        temp.Push(b.right);
                }
                else{
                    if(b.right!=null)
                        temp.Push(b.right);
                    if(b.left!=null)
                        temp.Push(b.left);
                }
            }
            s=temp;
            flag=!flag;
        }
    }
    public static ArrayList<LinkedList<BinaryTree>> llForAllNodesAtEachDepth(BinaryTree bt){
        ArrayList<LinkedList<BinaryTree>> res = new ArrayList<LinkedList<BinaryTree>>();
        return createLlForAllNodesAtEachDepth(res,bt, 0);
    }
    public static ArrayList<LinkedList<BinaryTree>> createLlForAllNodesAtEachDepth(ArrayList<LinkedList<BinaryTree>> res, BinaryTree bt, int level){
        if(bt==null)
            return null;
        if(level==res.size()){
            LinkedList<BinaryTree> list = new LinkedList<BinaryTree>();
            list.add(bt);
            res.add(list);
            createLlForAllNodesAtEachDepth(res,bt.left,level+1);
            createLlForAllNodesAtEachDepth(res,bt.right,level+1);
        }
        else{
            res.get(level).add(bt);
            createLlForAllNodesAtEachDepth(res,bt.left,level+1);
            createLlForAllNodesAtEachDepth(res,bt.right,level+1);
        }
        return res;
    }
    public static void zigZagTraversal(ArrayList<LinkedList<BinaryTree>> res){
        boolean flag=true;
        for(int i=0;i<res.size();i++){
            LinkedList<BinaryTree> temp = res.get(i);
            if(flag){
                for(int j=0;j<temp.size();j++){
                    System.out.print(temp.get(j).data+" -> ");
                }
                flag=false;
            }
            else{
                for(int j=temp.size()-1;j>=0;j--){
                    System.out.print(temp.get(j).data+" -> ");
                }
                flag=true;
            }
            System.out.println();
        }
    }
}
0
Mohit Motiani