很早之前面试lx折戟左二叉树高度,自己认真分析一下啊。
这里的一个重点就是分析清楚局部变量a和b是第几层的变量,需要的时候用gdb跟一下最清楚。本来以为非常简单,但是发现要给别人讲清楚、明白,自己要对每一个细节都特别清楚。
图,代码,打印输出一个都不少。
int height_oftree(struct node *root)
{
int a = 0, b = 0;
if (root == NULL) {
return 0;
} else {
printf("B:a=%d, b=%d, node:%d\n", a, b, root->data);
a = height_oftree(root->left);
printf("M:a=%d, b=%d, node:%d\n", a, b, root->data);
b = height_oftree(root->right);
printf("A:a=%d, b=%d, node:%d\n", a, b, root->data);
return (a > b)? (a+1) : (b+1);
}
}
B:a=0, b=0, node:0 //进入根节点,node 0
B:a=0, b=0, node:1 //根节点的左子树,lv1-l, node 1
M:a=0, b=0, node:1 //进入node 1 左子树,lv2-l, 这里为NULL,return 0, 返回node 1,【即a的值为0】
B:a=0, b=0, node:3 //进入node 1 右子树,lv2-r, node 3
B:a=0, b=0, node:5 //进入node 3 左子树,lv3-l, node 5
M:a=0, b=0, node:5 //进入node 5 左子树,lv4-l,这里为NULL,return 0, 返回node 5
A:a=0, b=0, node:5 //进入node 5 右子树, lv4-r,这里为NULL,return 0, 这里是会返回上一层 lv3-l, 这里注意返回的位置,这个决定了返回值是上一次的a的值还是b的值,这里返回到lv3-l,a的值
M:a=1, b=0, node:3 //返回node 3,此时a值为1
B:a=0, b=0, node:4 //进入node 3 右子树,lv3-r,node4,这里和node 5情况是一样的
M:a=0, b=0, node:4
A:a=0, b=0, node:4
A:a=1, b=1, node:3 //返回node 3 的右子树lv3-r,即b的值为1
A:a=0, b=2, node:1 //返回node 1 的右子树lv2-r,即b的值为1, 注意a的值是上面【】里面的a值
M:a=3, b=0, node:0 //返回上一层的node 0 的左子树,lv1-l,即a的值为3 (这个3是lv2-r里的b值+1得到)
B:a=0, b=0, node:2 //进入node 0 右子树, lv-r
M:a=0, b=0, node:2
A:a=0, b=0, node:2
A:a=3, b=1, node:0 //返回上一次node 0的右子树,即b=1
height=4