輸入一顆二元樹,從上往下按層打印樹的每一個結點,同一層中按照從左往右的順序打印

題目:

    輸入一顆二元樹,從上往下按層打印樹的每一個節點,同一層按照從左往右的順序打印。node


輸入樣例:

  8數組

 / /spa

 6 103d

/ / / /code

5 7 9 11排序

 

輸出樣例:

    8 6 10 5 7 9 11隊列


思路分析:

    把一顆二叉樹抽象成三個節點:根節點、左節點、右節點。
io

    先序遍歷便可獲得按行輸出的效果。
編譯

    對於左子樹只要保存其根節點,既保存了整個左子樹。(右子樹同樣)
class

    對於根節點以外的兩個子樹來講說,始終是先訪問左子樹的根節點,再訪問右子樹的根節點。

    所以能夠使用隊列存儲。

代碼實現(GCC編譯經過):

#include "stdio.h"
#include "stdlib.h"

//二叉樹節點
#define size 7

//二叉樹節點定義
typedef struct node
{
	int data;
	struct node *left;
	struct node *right;
}BTree;

int printLine(BTree * root);
BTree * CreatTree(int a[],int n);

int main(void)
{

        int array[size] = {8,6,10,5,7,9,11};
        BTree * root;

        root = CreatTree(array,size);
	printLine(root);	

        printf("\n");
	return 0;
}

int printLine(BTree * root)
{
	BTree * queue[size], *p;
	int front,rear;
	front = rear = 0;
	
	
	
	rear = (rear+1)%size;
	queue[rear] = root;	

        //循環結束爲隊列爲空
	while(front != rear)
	{        
	        //根出隊列
		front = (front +1)%size;
		p = queue[front];
		printf("%3d",p->data);

		//左孩子不空,隊不滿入隊
		if(p->left && ((rear+1)%size != front))
		{
			rear = (rear+1)%size;
			queue[rear] = p->left;
		}
                
                //右孩子不空,隊不滿入隊
		if(p->right && ((rear+1)%size != front))
		{
			rear = (rear+1)%size;
			queue[rear] = p->right;
		}
                
                //隊滿,報錯
		if((rear+1)%size == front)
		{
			printf("隊列空間不足,錯誤....\n");
			return 0;
		}
	}

	return 1;
}

//根據數組建立二叉排序樹
BTree * CreatTree(int a[],int n)
{
        BTree * root ,*p,*cu,*pa;
        int i;

        root = (BTree *)malloc(sizeof(BTree));
        root->data = a[0];
        root->left = root->right =NULL;

        for(i=1;i<n;i++)
        {
                p = (BTree *)malloc(sizeof(BTree));
                p->data = a[i];
                p->left = p->right =NULL;
                cu = root;

                while(cu)
                {
                        pa = cu;
                        if(cu->data > p->data)
                                cu = cu->left;
                        else
                                cu = cu->right;
                }
                if(pa->data > p->data)
                        pa->left = p;
                else
                        pa->right = p;
        }

        return root;
}
相關文章
相關標籤/搜索