0 引言
进入实验室已经一年有余,主要在用C/C++混编写桌面级应用/插件等,用的时候感觉很不顺手,尤其是涉及到 指针/二级指针手动释放内存以及非模态对话框类指针的引用与析构等问题时,经常一个不小心程序就直接,,,崩溃了,这让我很抓狂。 我深知自己写C/C++的功底还很差,并且对标IT市场,他们大概率也不需要我这样水平的C/C++程序员【囧】,所以打算主动求变,从刷题做起,主动采用面向对象的方法将以前习惯用C实现的各种数据结构逐步更新为java.
1 题目
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
2 分析
层次遍历二叉树即可
3 C/C++实现
(1)定义结点结构体
struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };
(2)层次遍历实现函数
// 二叉树的层次遍历 vector<int> PrintFromTopToBottom(TreeNode* root) { // 使用队列结构实现二叉树的层次遍历 vector<int> myTree; if(root == NULL) // 空指针判断 return myTree; queue<TreeNode*> myQue; TreeNode* p; myQue.push(root); // 根结点入队 while(!myQue.empty()){ p = myQue.front(); // 保持统一操作 myTree.push_back(p->val); if(p->left != NULL) myQue.push(p->left); if(p->right != NULL) myQue.push(p->right); myQue.pop(); } return myTree; }
(3)运行效率
4 java实现
(1)定义类
public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }
(2)层次遍历方法
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { Queue<TreeNode> myQue = new LinkedList<TreeNode>(); // Queue 声明并初始化 ArrayList<Integer> myArray = new ArrayList<Integer>(); // ArrayList 声明并初始化 if( root == null ) // 空指针判断,没有这行代码,输入会报错 return myArray; myQue.add( root ); while( !myQue.isEmpty() ){ TreeNode temp = myQue.peek(); myArray.add( temp.val ); if( temp.left != null ) myQue.offer( temp.left ); if( temp.right != null) myQue.offer( temp.right ); myQue.remove(); } return myArray; }
(3)运行效率
6 对比
(1)c实现不需要对队列和层次遍历结点数组进行初始化,Java需要
(2)都需要对NULL/null进行判断
(3)C/C++空间和时间效率完爆java,看起来很过瘾,但是java代码的robust性比C/C++高了不知道几个level
7 java的鲁棒性
(1)Java在编译和运行程序时都要对可能出现的问题进行检查,以防止错误的产生。
(2)Java编译器可以查出许多其他语言运行时才能发现的错误。
(3)Java不支持指针操作,大大减少了错误发生的可能性。
(4)Java具有异常处理的功能,当程序异常时,它能捕获并响应意外情况,以保证程序能稳妥地结束,计算机系统不会崩溃。而Java能运行虚拟机实现跨平台是Java的与平台无关性的特点。