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. php获取客户端浏览器以及操作系统信息的方法

    发布:sunday01   来源:net   阅读: 2   [大 中 小] 在较为智能的程序中,php可以获取客户端浏览器及操作系统信息,然后根据浏览器及系统类型,加载不同的页面,以提供更加个性化的 ...

  2. javascript中split字符串分割函数

    1. var ss=s.split("fs"); for(var i=0;i<ss.length;i++){ 处理每一个ss[i]; } 2. "2:3:4:5&q ...

  3. (转)C#与Java的证书密钥转换

    前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转 ...

  4. MySQL线上执行大事务或锁表操作

    前提 在线执行一些大事务或锁表操作(给某个核心级表加一列或者执行修改操作),此时不但主库从库要长时间锁表,主从延迟也会变大.未避免大事务sql对整个集群产生影响,,我们希望一条SQL语句只在Maste ...

  5. 第六节:宿主如何使用AppDomain

    前面已经讨论了宿主以及宿主加载CLR的方式.同时还讨论了宿主如何告诉CLR创建和卸载AppDomain.为了使这些讨论更加具体,下面将描述一些常见的宿主和AppDomain使用情形.特别地,我要解释不 ...

  6. Java jdk环境变量配置

    首先安装jdk,现在已经是jdk 8了,也不知道能不能好好用了...

  7. eclipse集成maven

    1.工具下载: Eclipse4.2 jee版本(这里使用最新的Eclipse版本,3.7以上版本按照以下步骤都可以) 下载地址:http://www.eclipse.org/downloads/do ...

  8. C基础 数据序列化简单使用和讨论

     前言 C中对序列化讨论少, 因为很多传输的内容都有自己解析的轮子. 对于序列化本质是统一编码, 统一解码的方式. 本文探讨是一种简单的序列化方案. 保证不同使用端都能解析出正确结果. 在文章一开始, ...

  9. 通过Maven搭建Mybatis项目

    学习通过maven工程搭建Mybatis工程开启对M ybaits的学习总结之旅. 1.首先创建Maven工程. 2.在pom.xml文件中加入依赖的jar <!-- mybatis核心包 -- ...

  10. android开发遇到SDK无法访问谷歌而安装不了的情况

    遇到SDK无法访问谷歌而安装不了的情况 1.修改C:\Windows\System32\drivers\etc的HOSTS文件,添加 #google_android更新203.208.46.146 d ...