1.20日学习总结

今天我又来做题解了。今天想说的是一个 通过程序判断二叉树深度的问题。 具体题目如下。

1.20日学习总结

我当初做这个题的方法。 是直接用结构体建了一个二叉树 。在用前序遍历的方式来找到深度。

用了一个max函数。 还用了一个deep变量来记录一下现在的深度。 max函数就是为了取出每次的最大值 这样将整个函数遍历完的话就可以找到深度了。

具体代码如下,

 

#include<stdio.h>
#include <algorithm>
using namespace std;
struct node {
    int left, right;
};
node tree[10000000];

int n, ans;

void dfs(int d, int deep) {
    if (d == 0) return ; 
    ans = max(ans, deep); 
    dfs(tree[d].left, deep+1); 
    dfs(tree[d].right, deep+1);//利用前序遍历
}

int main() {
    scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&tree[i].left,&tree[i].right);//以结构体来表示一个树林.
		} 
    dfs(1, 1); 
    printf("%d",ans);
    return 0; 
}

当然我这个代码有一点点小逻辑问题。 就是这个代码没法找到根节点。 也就是说我们第一个输入的必须要是根节点才行。 这个问题我在做另外一个题目的时候解决了。 但是当时我读这个题目的时候,并没有仔细研究。 当时做另外一个题目的时候,就解决了这个问题。具体来说呢?就是多建了一个数据域来存储。他们的根节点 就相当于每个子树。 存储了他们的上一个节点。 也就是相对于他们的根节点。 这样的话,整颗树中只有根节点,没有自己的祖宗。  就可以找到结构体中的根节点。

既然都说到这里了,就把那一题的题解。也做了吧。题目如下。

1.20日学习总结

 而这个题的解决方法就上述我也说了一点。唯一还要补充的就是这里的元素多是字符, 或者说都是字母。 然后我就利用强制转化的方式。把他们转化成了int 型 以此就可以利用下结构体的下标,

然后存储件数的方式。 就是我所说的建造三个数据域, 分别存储他的祖宗。和左右节点。 然后再进行遍历。然后总体的思路就是这样的。 代码如下,

 #include<stdio.h>
 #include<string.h>
 #include<iostream>
 using namespace std;
 struct node{          
     char left,right,ss;    
 };
 node tree[1000];
 void dfs(char s)
 {                              
     printf("%c", s);
     if (tree[s].left!='*') dfs(tree[s].left);
     if (tree[s].right!='*') dfs(tree[s].right);
 }
 int main()
 {
     int i,n;
     char c,f1;
     char d[10000];
     cin>>n;
     for (i=1;i<=n;i++){     
         cin>>c;
         d[i]=c;
         cin>>tree[c].left>>tree[c].right;
         tree[tree[c].left].ss = tree[tree[c].right].ss = c;
     }for(i=1;i<=n;i++){
	 	if(tree[d[i]].ss==0){
		 	f1=d[i];
		 }
	 }
     dfs (f1);
     return 0;
 }

今天的总结就到这里了 。我也会把这几天的题解全部都做出来的。 我会尽我所能的,做的比较详细。  也是二次理解这些题目。

上一篇:【回顾】html简介、基础、元素


下一篇:机器学习西瓜书——决策树(Decision Tree)部分总结