zoukankan      html  css  js  c++  java
  • 《编程之美》3.10分层遍历二叉树

    #include<iostream>
    #include<vector>
    using namespace std;
    
    const int Max=30;
    class Node
    {
    public:
    	Node(int d):data(d),left(NULL),right(NULL){}
    	int data;
    	Node *left;
    	Node *right;
    };
    
    template<class T>
    class queue
    {
    public:
    	queue(int i=Max):front(0),rear(0){Q=new T[Max];}
    	void EnQueue(Node *p){Q[rear++] = p;}
    	T DeQueue(){return Q[front++];}
    	int front;
    	int rear;
    	T *Q;
    };
    
    int PrintNodeAtLevel(Node *root,int level)//递归
    {
    	if(!root || level<0)
    		return 0;
    	if(level==0)
    	{
    		cout<<root->data<<" ";
    		return 1;
    	}	
    	PrintNodeAtLevel(root->left,level-1);
    	PrintNodeAtLevel(root->right,level-1);
    }
    void PrintNode(Node *root)
    {
    	for(int level=0; ;level++)
    	{
    		if(!PrintNodeAtLevel(root,level))
    			break;
    		cout<<endl;
    	}
    }
    
    void PrintNodeByLevel(Node *root)//非递归
    {
    	if(root==NULL)
    		return;
    	vector<Node *> vec;
    	vec.push_back(root);
    	int cur=0;
    	int last=1;
    	while(cur<vec.size())
    	{
    		last=vec.size();
    		while(cur<last)
    		{
    			cout<<vec[cur]->data<<" ";
    			if(vec[cur]->left)
    				vec.push_back(vec[cur]->left);
    			if(vec[cur]->right)
    				vec.push_back(vec[cur]->right);
    			cur++;
    		}
    		cout<<endl;
    	}
    }
    
    void PrintNodeByBFS(Node *root) //BFS
    {
    	if(root==NULL)
    		return;
    	queue<Node *> que;
    	que.EnQueue(root);
    	Node *q;
    	while(que.front<que.rear)
    	{
    		int	last=que.rear;
    		while(que.front<last)
    		{
    			q=que.DeQueue();
    			cout<<q->data<<" ";
    			if(q->left)
    				que.EnQueue(q->left);
    			if(q->right)
    				que.EnQueue(q->right);
    		}
    		cout<<endl;
    	}
    }
    //扩展问题
    /*
    *依然是按层遍历二叉树,只是要求从下往上访问,并且每一层中结点的访问顺序为从右向左
    
    *分析:只要层与层之间加入哑元素(NULL),然后逆序输出队列Q即可
    
    */
    void PrintNodeDown2UpRight2Left(Node *root)
    {
    	if(root==NULL)
    		return;
    	queue<Node *> que;
    	que.EnQueue(root);
    	que.EnQueue(NULL);
    	Node *q;
    	while(que.front<que.rear-1)
    	{
    		int last=que.rear-1;
    		while(que.front<last)
    		{
    			q=que.DeQueue();
    			if(q->left!=NULL)
    				que.EnQueue(q->left);
    			if(q->right!=NULL)
    				que.EnQueue(q->right);
    		}
    		que.EnQueue(NULL);//如果左右子树为空又多加入一个NULL
    		que.front=last+1;
    	}
    
    	for(int i=que.rear-3;0<=i;i--)//逆序打印
    	{
    		if(que.Q[i]!=NULL)
    			cout<<que.Q[i]->data<<" ";
    		else
    			cout<<endl;
    	}
    	cout<<endl;//只是为了排版
    
    }
    
    int main()
    {
    	Node *p1 = new Node(1);
        Node *p2 = new Node(2);
        Node *p3 = new Node(3);
        Node *p4 = new Node(4);
        Node *p5 = new Node(5);
        Node *p6 = new Node(6);
        Node *p7 = new Node(7);
        Node *p8 = new Node(8);
        p1->left = p2;
        p1->right = p3;
        p2->left = p4;
        p2->right = p5;
        p3->right = p6;
        p5->left = p7;
        p5->right = p8;
        Node *root = p1;
    	//PrintNode(root);
        //PrintNodeByLevel(root);
    	//PrintNodeByBFS(root);
    	PrintNodeDown2UpRight2Left(root);
    	return 0;
    }
    

  • 相关阅读:
    shell 自动登录 上传 下载
    用例设计----PICT&Allpairs
    已有实例 Oracle 下新增实例
    【原创】安卓兼容性测试
    【原创】某版本性能测试
    【原创】Jmeter正则表达式提取json中多个关联值
    【转】四种常见的 POST 提交数据方式
    rfw使用接口库测试--FAIL : UnicodeEncodeError: 'ascii' codec can't encode characters in position
    【原创】Robotframework 简介
    java学习笔记_内存分析
  • 原文地址:https://www.cnblogs.com/flyoung2008/p/2143723.html
Copyright © 2011-2022 走看看