CareerCup-4.1

Implement a function to check if a tree is balanced For the purposes of this question, a balanced tree is defined to be a tree such that no two leaf nodes differ in distance from the root by more than one

答案是两次遍历分别求出最大深度与最小深度,我试着一次遍历求出最大和最小深度

#include <iostream>
using namespace std;
typedef int Data;

struct TreeNode
{
    TreeNode(Data d):data(d){left = right = NULL;};
    Data data;
    TreeNode* left;
    TreeNode* right;
};

class Tree
{
public:
    Tree():root(NULL){};
    TreeNode* root;
    void insert(Data data, TreeNode* node = NULL)
    {
        if(root == NULL)
        {
            root = new TreeNode(data);
            return;
        }
        if(node == NULL) node = root;
        if(data == node->data)
        {
            return;
        } else if(data < node->data) {
            if(node->left == NULL)
                node->left = new TreeNode(data);    
            else
                insert(data, node->left);
        } else {
            if(node->right == NULL)
                node->right = new TreeNode(data);
            else
                insert(data, node->right);
        }
    };
    void inorderPrint(TreeNode* TreeNode)
    {
        if(TreeNode == root)
            cout<<"Print:"<<endl;
        if(TreeNode != NULL)
        {
            inorderPrint(TreeNode->left);
            cout<<TreeNode->data<<" ";
            inorderPrint(TreeNode->right);
        }
        if(TreeNode == root)
            cout<<endl<<"End"<<endl;
    };
    void preorderPrint(TreeNode* TreeNode)
    {
        if(TreeNode == root)
            cout<<"Print:"<<endl;
        if(TreeNode != NULL)
        {
            cout<<TreeNode->data<<" ";
            preorderPrint(TreeNode->left);
            preorderPrint(TreeNode->right);
        }
        if(TreeNode == root)
            cout<<endl<<"End"<<endl;
    };
    void postorderPrint(TreeNode* node)
    {
        if(node == root)
            cout<<"Print:"<<endl;
        if(node != NULL)
        {
            postorderPrint(node->left);
            postorderPrint(node->right);
            cout<<node->data<<" ";
        }
        if(node == root)
            cout<<endl<<"End"<<endl;
    };
    bool isBalanced()
    {
        int min=0 ,max=0;
        calDepth(root, 0, &min, &max);
        cout<<"Min: "<<min<<endl<<"Max: "<<max<<endl;
        if(max - min < 2)
            return true;
        else
            return false;
    };
    void calDepth(TreeNode* node, int depth, int* min, int* max)
    {
        if(node == NULL) return;
        depth++;
        if(node->left == NULL && node->right == NULL)
        {
            if(depth < *min || *min <= 0)
                *min = depth;
            if(depth > *max || *max <= 0)
                *max = depth;
        }
        calDepth(node->left, depth, min, max);
        calDepth(node->right, depth, min, max);
    };
};

int main()
{
    Tree tree;
    tree.insert(5);
    tree.insert(1);
    tree.insert(7);
    tree.insert(4);
    tree.insert(3);
    cout<<boolalpha<<tree.isBalanced();
    system("pause");
};

Comments

comments powered by Disqus