定制app网站wordpress讨论
定制app网站,wordpress讨论,微信朋友圈广告30元 1000次,学网络工程师刷题 1022.从根到叶的二进制数之和题目描述#xff1a;思路一#xff08;dfs深搜万能版#xff09;思路二 #xff08;栈迭代巧解版#xff09;总结 Thanks♪(#xff65;ω#xff65;)#xff89;谢谢阅读#xff01;#xff01;#xff01;下一篇文章见#xff… 刷题 1022.从根到叶的二进制数之和题目描述思路一dfs深搜万能版思路二 栈迭代巧解版总结 Thanks♪(ω)谢谢阅读下一篇文章见 1022.从根到叶的二进制数之和
题目描述 题目给出一棵二叉树我们需要统计计算每条路径的二进制之和。给出的测试用例是 1,0,1,0,1,0,1 则运算为(100) (101) (110) (111) 4 5 6 7 22。 难点就在于如何进行每个节点的储存计算一般来说二叉树都会使用遍历或栈来进行运算。那就让我们来看看这个题如何完美解答吧
思路一dfs深搜万能版
一般我们遇到二叉树都会想到遍历但是这道题我们需要做到是如何记录该节点之前的数据只有这样才能来进行每条路径的计算。所以首先我们需要单独写入一个函数来满足我们的需求 dfs(struct TreeNode* root ,int val) 其中root负责遍历val来储存之前的数据这样就可以进行操作了 首先我们需要确定递归的返回条件明确条思路才能顺畅解题
如果二叉树为空 返回零如果该节点为叶子节点 返回节点值与前面数据值 val 的和如果不是叶子节点 返回左右二叉树的和 与 前面数据值 val 的和
确定了返回条件就简单了把条件写好剩下的交给计算机计算就OK了
int dfs(struct TreeNode* root,int val){//如果二叉树为空 返回零if(root NULL) return 0;//如果该节点为叶子节点 返回节点值与前面数据值 val 的和else if(!root-left!root-right) return (val 1) | root-val;//相当于(val*2) root-val//如果不是叶子节点 返回左右二叉树的和与前面数据值 val 的和else{val (val1) | root-val;//相当于(val*2) root-valreturn dfs(root-left,val) dfs(root-right ,val);}
}
int sumRootToLeaf(struct TreeNode* root){return dfs(root,0);
}这里之所以使用位操作而不是使用乘法操作是因为使用位操作效率更高乘法的底层是位运算乘法器所以直接使用就避免了多余的操作。 来看运行结果 直接秒天秒地秒世界过啦
思路二 栈迭代巧解版
该算法是使用栈来模拟函数递归的过程
typedef struct TreeNode Node;int sumRootToLeaf(struct TreeNode* root){Node** stack (Node*)malloc(sizeof(Node)*1001);Node* prev NULL;int ret 0;int val 0,top 0;while(root ! NULL || top){while(root ! NULL){stack[top] root;val (val 1)| root-val;root root-left;}root stack[top - 1];if(root-right NULL || root-right prev){if(root-right NULL root-left NULL){ret val;}val 1;top--;prev root;root NULL;}else{root root-right;}}free(stack);return ret;
}选择遍历二叉树的办法是
先创建一个指针 prev 用于储存上一个读取的节点先在栈里储存二叉树左边的一条路径一直 root root-left压栈然后取出栈顶节点(root stack[top-1])
接下来是非常关键的一步 4. 如果该节点的右节点为空 或者 右节点已经遍历过了 就跳过 更替指针prev rootroot NULL否则就进入root 右半树root root-right 5. 循环执行2 - 4 就可以实现效果
只看代码还是十分难理解的我使用图来简单解释一下 就这样一步一步进行就可以遍历整个树是不是十分巧妙。结果自然是过啦 这种方法比较复杂是非递归遍历二叉树的常用方法。
总结
通过这道题我学会了递归的深度搜索方法快速解决问题 也初步认识到了非递归遍历二叉树的方法。但还是不太理解不知道是如何推出来的。
Thanks♪(ω)谢谢阅读
下一篇文章见
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91912.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!