面试题32:从上到下打印二叉树

题目描述

不分行从上到下打印二叉树

利用队列,打印当前节点时,应将该节点的孩子节点放入队列中。每次取队首元素进行打印

分行从上到下打印?

加入分行的标志节点,一个变量表示当前的节点数,另一个表示下层节点数


void PrintTree(BinaryTreeNode *pRoot)
{
	if(pRoot == nullptr)
		return;
	queue<BinaryTreeNode *>nodes;
	nodes.push(pRoot);
	int nextLevel = 0;
	int toBePrint = 1;
	while(!nodes.empty())
	{
		BinaryTreeNode *pNode = nodes.front();
		cout<<pNode->val<<" ";
		if(pNode->left !=nullptr)
		{
			nodes.push(pNode->left);
			nextLevel ++;
		}
		if(pNode->right != nullptr)
		{
			nodes.push(pNode->right);
			nextLevel++;
		}
		nodes.pop();
		toBePrint--;
		if(toBePrint == 0)
		{
			cout<<endl;
			tiBePrint = nextLevel;
			nextLevel = 0;
		}
	}
	
}

leetcode

  1. 二叉树的层次遍历
    给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>>res;
        if(root ==nullptr) return res;
        vector<int>nodes;
        queue<TreeNode *>record;
        record.push(root);
        
        int currentlevel = 1;
        int nextlevel = 0;
        
        while(!record.empty())
        {
            TreeNode *Node = record.front();
            nodes.push_back(Node->val);
            if(Node->left!=nullptr)
            {
                record.push(Node->left);
                nextlevel ++;
            }
            if(Node->right !=nullptr)
            {
                record.push(Node->right);
                nextlevel++;
            }
            record.pop();
            currentlevel--;
            if(currentlevel == 0)
            {
                currentlevel = nextlevel;
                nextlevel = 0;
                res.push_back(nodes);
                nodes.clear();
            }
        }
        return res;
    }
};

执行用时 : 12 ms, 在Binary Tree Level Order Traversal的C++提交中击败了95.17% 的用户
内存消耗 : 13.9 MB, 在Binary Tree Level Order Traversal的C++提交中击败了50.53% 的用户

leetcode 二叉树的层次遍历 II

  1. 二叉树的层次遍历 II
    给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

只需要把上面代码改一句res的插入位置即可

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int>>res;
        if(root ==nullptr) return res;
        vector<int>nodes;
        queue<TreeNode *>record;
        record.push(root);
        
        int currentlevel = 1;
        int nextlevel = 0;
        
        while(!record.empty())
        {
            TreeNode *Node = record.front();
            nodes.push_back(Node->val);
            if(Node->left!=nullptr)
            {
                record.push(Node->left);
                nextlevel ++;
            }
            if(Node->right !=nullptr)
            {
                record.push(Node->right);
                nextlevel++;
            }
            record.pop();
            currentlevel--;
            if(currentlevel == 0)
            {
                currentlevel = nextlevel;
                nextlevel = 0;
                res.insert(res.begin(), nodes);
                nodes.clear();
            }
        }
        return res;
    }
};

执行用时 : 20 ms, 在Binary Tree Level Order Traversal II的C++提交中击败了64.92% 的用户
内存消耗 : 14.1 MB, 在Binary Tree Level Order Traversal II的C++提交中击败了30.31% 的用户

leeched 二叉树的层平均值

  1. 二叉树的层平均值
    给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.

同样,修改条件即可

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
                vector<double>res;
        if(root ==nullptr) return res;
        double sum = 0.0;
        queue<TreeNode *>record;
        record.push(root);
        double avg = 0.0;
        int currentlevel = 1;
        int count = 1;
        int nextlevel = 0;
        
        while(!record.empty())
        {
            
            TreeNode *Node = record.front();
            sum += Node->val;
            if(Node->left!=nullptr)
            {
                record.push(Node->left);
                nextlevel ++;
            }
            if(Node->right !=nullptr)
            {
                record.push(Node->right);
                nextlevel++;
            }
            record.pop();
            currentlevel--;
            if(currentlevel == 0)
            {
                currentlevel = nextlevel;
                nextlevel = 0;
                avg = sum / count;
                res.push_back(avg);
                avg = 0.0;
                sum =0.0;
                count  = currentlevel;
                
            }
        }
        return res;
    }
};
发布了68 篇原创文章 · 获赞 2 · 访问量 6181

猜你喜欢

转载自blog.csdn.net/qq_30050175/article/details/90579596