http://www.geeksforgeeks.org/bottom-view-binary-tree/

Bottom View of a Binary Tree

Given a Binary Tree, we need to print the bottom view from left to right. A node x is there in output if x is the bottommost node at its horizontal distance. Horizontal distance of left child of a node x is equal to horizontal distance of x minus 1, and that of right child is horizontal distance of x plus 1.

Examples:

                      20
/ \
8 22
/ \ \
5 3 25
/ \
10 14

For the above tree the output should be 5, 10, 3, 14, 25.

If there are multiple bottom-most nodes for a horizontal distance from root, then print the later one in level traversal. For example, in the below diagram, 3 and 4 are both the bottom-most nodes at horizontal distance 0, we need to print 4.

                      20
/ \
8 22
/ \ / \
5 3 4 25
/ \
10 14

For the above tree the output should be 5, 10, 4, 14, 25.

解决思路:算出二叉树最左边节点的距离,在算出二叉树最右边节点的距离,可以得出这棵二叉树所有节点的距离范围,如果根节点的水平距离为9,那么上边两个二叉树的距离范围是[-2, 2]。也就是说,输出节点应该有5个。那么怎么算每个节点的水平距离?首先要层次遍历二叉树,根据规则,根节点的左边孩子的水平距离是根节点水平距离减1,根节点右边孩子水平距离是根节点水平距离加1,层次遍历二叉树过程中,就算出了每个节点的水平距离,但是要求输出的水平距离只对应一个节点,所以要留下水平距离值相同的最后一个节点,用map可以做到。

http://blog.csdn.net/zzran/article/details/41981969

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <limits.h>
using namespace std; void printArray(int *array, int size)
{
for(int i = ; i < size; i++)
cout << array[i]<< "\t" ;
cout << endl;
} void printVector(vector<int> array )
{
for(int i = ; i <array.size(); i++)
cout << array[i]<< "\t" ;
cout << endl;
} struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}; void preorder(TreeNode * root)
{
if(root == NULL) return;
cout << root->val << "\t" ;
preorder(root->left);
preorder(root->right);
} void inorder(TreeNode * root)
{
if(root == NULL) return;
inorder(root->left);
cout << root->val << "\t" ;
inorder(root->right);
} void postorder(TreeNode * root)
{
if(root == NULL) return;
postorder(root->left);
postorder(root->right);
cout << root->val << "\t" ;
} struct newNode
{
TreeNode* m_node;
int m_idx;
newNode(TreeNode* node, int idx)
{
m_node = node;
m_idx = idx;
}
}; class Solution {
public:
vector<int> bottomView(TreeNode* root) {
queue<newNode* > q1;
queue<newNode* > q2;
vector<int> res;
map<int, int> mapping;// index -- value pair if(root != NULL)
{
q1.push(new newNode(root, ));
} int leftMost = ;
int rightMost = ;
while(!q1.empty())
{
newNode * p = q1.front();
q1.pop(); mapping[p->m_idx] = p->m_node->val; if(p->m_idx < leftMost)
leftMost = p->m_idx;
if(p->m_idx > rightMost)
rightMost = p->m_idx; if(p->m_node->left)
q2.push(new newNode(p->m_node->left, p->m_idx - ) );
if(p->m_node->right)
q2.push(new newNode(p->m_node->right, p->m_idx + )); if(q1.empty() /*&& !q2.empty()*/)
{
swap(q1, q2);
}
} for(map<int, int>::iterator it = mapping.begin(); it != mapping.end(); it++)
{
cout << it->first <<"\t" <<it->second << endl;
}
for(int i = leftMost ; i <= rightMost ; i++)
res.push_back(mapping[i]);
return res;
} }; int main()
{
TreeNode node0();
TreeNode node1();
TreeNode node2();
TreeNode node3();
TreeNode node4();
TreeNode node5();
TreeNode node6(); node0.left = &node1;
node0.right= &node2; node1.left = &node3;
node1.right= &node4; node2.left = &node5;
node2.right= &node6; Solution sl;
vector<int> res = sl.bottomView(&node0); printVector(res);
cout << endl;
return ;
}

另外,top view也可以用这样的方法,不是保留最后一个,而是保留第一次idx的结构,后续的数据不保存。

[geeksforgeeks] Bottom View of a Binary Tree的更多相关文章

  1. 【LeetCode】199. Binary Tree Right Side View

    Binary Tree Right Side View Given a binary tree, imagine yourself standing on the right side of it, ...

  2. 【刷题-LeetCode】199 Binary Tree Right Side View

    Binary Tree Right Side View Given a binary tree, imagine yourself standing on the right side of it, ...

  3. [geeksforgeeks] Convert a given Binary Tree to Doubly Linked List

    http://www.geeksforgeeks.org/in-place-convert-a-given-binary-tree-to-doubly-linked-list/ Given a Bin ...

  4. Print Nodes in Top View of Binary Tree

    Top view of a binary tree is the set of nodes visible when the tree is viewed from the top. Given a ...

  5. Convert a given Binary Tree to Doubly Linked List

    The question and solution are from: http://www.geeksforgeeks.org/convert-given-binary-tree-doubly-li ...

  6. leetcode 199 :Binary Tree Right Side View

    // 我的代码 package Leetcode; /** * 199. Binary Tree Right Side View * address: https://leetcode.com/pro ...

  7. [leetcode]199. Binary Tree Right Side View二叉树右侧视角

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  8. [LeetCode] 199. Binary Tree Right Side View 二叉树的右侧视图

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  9. LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)

    199. 二叉树的右视图 199. Binary Tree Right Side View 题目描述 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. Giv ...

随机推荐

  1. WordPress 主题开发 - (七) 让主题更安全 待翻译

    We're just about ready to start building our theme's template files. Before we do this, however, it' ...

  2. TextView字符串波浪式跳动--第三方开源---JumpingBeans

    在github上有一个开源项目:JumpingBeans,其项目主页是:https://github.com/frakbot/JumpingBeans JumpingBeans将一个普通的Androi ...

  3. WCF全面解析第一章 WCF 简介

    1.WCF中的 "A","B","C" 介绍 我们先看个生活中的例子,某一天,公司的领导让你去送一份合同文件,送文件的过程你可以选择的交通方 ...

  4. MVC MVVM Knockout viewmodel 提交 完整过程,包含序列化 JSON 和 字典模型绑定

    //JSON 通用操作------------------------------------------------------------------------------using Syste ...

  5. Python科学计算利器——Anaconda

    (搬运自我在SegmentFault的博客) 最近在用Python做中文自然语言处理.使用的IDE是PyCharm.PyCharm确实是Python开发之首选,但用于科学计算方面,还略有欠缺.为此我尝 ...

  6. ios第三方分享到qq、微信、人人网、微博总结

    我们开发出来的APP通常要通过第三方分享到其他社交平台,如qq.微博微信 等.通过分享可以提高APP的传播效率,增加APP的曝光率,因此也算是APP功能 里的标配了吧.目前常用的第三方分享途径有qq. ...

  7. [原创]Postgres-XC集群笔记-概念与环境搭建

    文所描述的Postgres-XC版本:v1.2.1项目主页地址:http://sourceforge.net/projects/postgres-xc/ pdf文件下载: Postgres-XC集群搭 ...

  8. android线程间通讯

    近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图 ...

  9. Word2013死机的问题

    Word2013用公式编辑器经常死机,网上介绍方法.试试看https://zhidao.baidu.com/question/937023473910649252.html1.启动word2013 2 ...

  10. C#取枚举描述

    一直都觉得枚举是个很不错的东西,可以给我们带来很多方便,而且也增加代码的可读性. 我在之前已经介绍过枚举的简要应用了,再次再来写下怎么获取枚举的描述. 源码如下: 首先,我们定义个含有描述的枚举类型 ...