zoukankan      html  css  js  c++  java
  • 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

    // test20.cpp : 定义控制台应用程序的入口点。
    //

    #include "stdafx.h"
    #include<iostream>
    #include<vector>
    #include<string>
    #include<queue>
    #include<stack>
    #include<cstring>
    #include<string.h>
    #include<deque>
    
    using namespace std;
    
    
    
    struct TreeNode {
    	int val;
    	struct TreeNode *left;
    	struct TreeNode *right;
    	TreeNode(int x) :
    	val(x), left(NULL), right(NULL) {
    	}
    };
    class Solution {
    public:
    	vector<vector<int> > Print(TreeNode* pRoot) {
    		vector<vector<int>> vec;
    		vector<int> v;
    		deque<TreeNode *>  parent;//用来打印父节点
    		deque<TreeNode *>  child;//用来存储子节点
    		int flag = 0;//用来标注是奇数行还是偶数行;奇数行从左像右打印;偶数行从右向左打印;
    
    		if (pRoot == NULL) return{};
    		parent.push_back(pRoot);
    		while (!parent.empty ())
    		{
    			++flag;
    			for (auto it = parent.begin();it != parent.end();it++)
    			{
    				v.push_back((*it)->val);
    			}
    			vec.push_back(v);
    			v.clear();
    			if (flag % 2==1)
    			{
    				while (!parent.empty())
    				{
    					if (parent.back()->right != NULL)	child.push_back(parent.back()->right);
    					if(parent.back()->left!=NULL)	child.push_back(parent.back()->left);
    					parent.pop_back();
    				}
    			}
    			else
    			{
    				while (!parent.empty())
    				{
    					if (parent.back()->left != NULL)	child.push_back(parent.back()->left);
    					if (parent.back()->right != NULL)	child.push_back(parent.back()->right);
    					parent.pop_back();
    				}
    			}
    			while (!child.empty ())
    			{
    				parent.push_back(child.front());
    				child.pop_front();
    			}
    			
    		}
    		return vec;
    	}
    	int  NodeCount(TreeNode *T)
    	{
    		if (T == NULL) return 0;
    		else
    		{
    			return NodeCount(T->left) + NodeCount(T->right) + 1;
    		}
    	}
    
    	int count_0=0, count_1=0, count_2=0;
    	void NodeCoutNUM(TreeNode *T)
    	{
    		if (T == NULL) return;
    		if (T->left == NULL&&T->right == NULL)
    		{
    			++count_0;
    		}
    		if (T->left != NULL&&T->right == NULL)
    		{
    			++count_1;
    			NodeCoutNUM(T->left);
    	
    		}
    		if (T->left == NULL&&T->right != NULL)
    		{
    			++count_1;
    			NodeCoutNUM(T->right);
    		}
    
    		if (T->left != NULL&&T->right != NULL)
    		{
    			++count_2;
    			NodeCoutNUM(T->left);
    			NodeCoutNUM(T->right);
    		}
    	
    	}
    
    	
    
    	void createBiTree(TreeNode* &T)
    	{
    		int num;
    		cin >> num;
    		if (num==0) return;
    		else
    		{
    			T = new TreeNode(num);
    			createBiTree(T->left);
    			createBiTree(T->right);
    		}
    	}
    	void preOrderTraver(TreeNode *T)
    	{
    		if (T == NULL) return;
    		else
    		{
    			cout << T->val << "  ";
    			preOrderTraver(T->left);
    			preOrderTraver(T->right);
    		}
    	}
    
    };
    int main()
    {
    	
    	Solution so;
    	TreeNode *T=NULL;
    
    	so.createBiTree(T);
    	cout << "创建T成功!" << endl;
    	cout << "前序遍历二叉树的结果是:" << endl;
    	so.preOrderTraver(T);
    	cout << endl;
    	
    	so.NodeCoutNUM(T);
    	cout << "总的节点个数:" << so.NodeCount(T) << endl;
    	cout << "度为 0 的节点个数:" <<so.count_0 <<endl;
    	cout << "度为 1 的节点个数:" << so.count_1 << endl;
    	cout << "度为 2 的节点个数:" << so.count_2 << endl;
    
    	vector<vector<int> > vec =so.Print(T);
    	for (auto it = vec.begin();it != vec.end();++it)
    	{
    		for (auto i = it->begin();i != it->end();++i)
    		{
    			cout << *i << "  " ;
    		}
    		cout << endl;
    	}
    	
    	cout << endl;
    	return 0;
    }
    

    注意:使用到容器 双向队列;
    另外可以使用 reserve,但是这种方法效率比较低;
    此方法中还有计算二叉树的节点个数,度数为0的节点个数,度数为1的节点个数,度数为2的节点个数的算法

  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/wdan2016/p/6002231.html
Copyright © 2011-2022 走看看