描述
求一棵二叉树的倾斜度,其中一个节点的倾斜度定义为“左子树元素之和”与“右子树元素之和”差的绝对值(空节点的元素值为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; }