[geeksforgeeks] Bottom View of a Binary Tree

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 = 0; i < size; i++)
        cout << array[i]<< "\t" ;
    cout << endl;
}


void printVector(vector<int> array )
{
    for(int i = 0; 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, 0));
            }

            int leftMost = 0;
            int rightMost = 0;
            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 - 1) );
                if(p->m_node->right)
                    q2.push(new newNode(p->m_node->right, p->m_idx + 1 ));

                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(4);
    TreeNode node1(2);
    TreeNode node2(7);
    TreeNode node3(1);
    TreeNode node4(3);
    TreeNode node5(5);
    TreeNode node6(8);

    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 0;
}

 

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

posted @ 2015-07-22 15:51  穆穆兔兔  阅读(499)  评论(0编辑  收藏  举报