zoukankan      html  css  js  c++  java
  • [LeetCode] Binary Tree Level Order Traversal 2

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).

    For example: Given binary tree {3,9,20,#,#,15,7},

        3
       / 
      9  20
        /  
       15   7
    

     

    return its bottom-up level order traversal as:

    [
      [15,7]
      [9,20],
      [3],
    ]

    head.h里代码实现如下:
    #include<vector>
    #include<queue>
    using namespace std;
    #define NULL 0
    
    struct TreeNode
    {
    	int val;
    	TreeNode *left;
    	TreeNode *right;
    	TreeNode(int x):val(x),left(NULL),right(NULL) {}
    };
    
    struct Node
    {
    	TreeNode *node;
    	int level;
    	Node(){}
    	Node(TreeNode *n,int l):node(n),level(l){}
    };
    
    class Solution
    {
    private:
    	vector<vector<int> > ret;
    	vector<vector<int> > retReverse;
    public:
    	vector<vector<int> > leverOrder(TreeNode *root)
    	{
    		ret.clear();
    
    		if(root == NULL)
    			return ret;
    
    		queue<Node> q;
    		q.push (Node(root,0));
    
    		vector<int> a;
    		int curLever = -1;
    
    		while(!q.empty() )
    		{
    			Node node = q.front();
    			if(node.node->left)
    				q.push(Node(node.node->left,node.level+1));
    			if(node.node->right)
    				q.push(Node(node.node->right,node.level+1));
    
    			if(curLever != node.level)
    			{
    				if(curLever != -1)
    					ret.push_back(a);
    				curLever = node.level ;
    				a.clear();
    				a.push_back(node.node->val);
    			}
    			else
    				a.push_back(node.node->val);
    			
    			q.pop();
    		}
    
    		ret.push_back(a);
    
    		retReverse.clear();
    
    		for(int i=ret.size()-1;i>=0;i--)
    			retReverse.push_back(ret[i]);
    
    		return retReverse;
    
    	}
    };
    

     main.cpp里代码实现如下:

    #include"head.h"
    #include<iostream>
    
    int main()
    {
     TreeNode *root;
     root=new TreeNode(3);
     root->left = new TreeNode(9);
     root->right =  new TreeNode(20);
     root->right->left =  new TreeNode(15);
     root->right->right =  new TreeNode(7);
     Solution sol;
     for(vector<vector<int> >::size_type ix=0;ix!=sol.leverOrder(root).size();++ix)
      {for(vector<int>::size_type i=0;i!=sol.leverOrder(root)[ix].size();++i)
           cout<<sol.leverOrder(root)[ix][i]<<" ";
          cout<<endl;}
    delete root->right->right;
     delete root->right->left;
     delete root->right;
     delete root->left;
     delete root;

     return 0;
    }
  • 相关阅读:
    BAT脚本编写要点(1)_特殊字符
    开源爬虫软件汇总
    使用Gradle发布项目到JCenter仓库
    解决Android中,禁止ScrollView内的控件改变之后自动滚动
    理解RESTful架构
    一种为 Apk 动态写入信息的方案
    Proguard配置注解
    使用statsvn统计svn中的代码量
    android如何释放图片缓存
    Git命令参考手册(文本版)
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3454610.html
Copyright © 2011-2022 走看看