求一棵二叉树的倾斜度

描述

求一棵二叉树的倾斜度,其中一个节点的倾斜度定义为“左子树元素之和”与“右子树元素之和”差的绝对值(空节点的元素值为0),二叉树的倾斜度定义为所有节点的倾斜度之和。

二叉树节点定义如下:

struct TreeNode {

    int val;

    struct TreeNode *left;

    struct TreeNode *right;

};

题目部分代码已经完成,您只需要补充并提交以下函数:

int findTilt(struct TreeNode* root);

输入

输入为若干个整数(不超过512)表示一棵二叉树顺序表示时的结点元素值,其中0表示二叉树对应结点为空。输入以-1结束。 

输出

输出二叉树的倾斜度。

样例输入

1 2 3 -1

样例输出

 1

#include<bits/stdc++.h>
using namespace std;
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

int s;
int dfs(struct TreeNode* t)
{
    if(t==NULL)
        return 0;
    int l=dfs(t->left);
    int r=dfs(t->right);
    s=s+abs(l-r);
    return l+r+t->val;
}
int findTilt(struct TreeNode* root)
{
    dfs(root);
    return abs(s);
}

TreeNode*creat()
{
    int front=1,rear=0,x;
    TreeNode*qu[1005],*t,*root=NULL;
    while(scanf("%d",&x)!=EOF,x!=-1)
    {
        if(x==0)
            t=NULL;
        else
        {
            t=new TreeNode;
            t->val=x;
              t->left=NULL;
            t->right=NULL;
        }
        qu[++rear]=t;
        if(rear==1)
            root=t;
        else
        {
            if(t&&qu[front])
            {
                if(rear%2==0)
                    qu[front]->left=t;
                else 
                    qu[front]->right=t;
            } 
            if(rear%2==1)
                front++;
        } 
    }
    return root;
}
int main()
{
    TreeNode*x=creat();
    printf("%d\n",findTilt(x));
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/kannyi/p/8993733.html