LEETCODE DIARY DAY1
94 Binary Tree Inorder Traversal 输出中序遍历
//中序遍历 递归?
//渐渐拾起JAVA语言(然而笔试不允许javaTT)
solution1:
class Solution
{
public List<Integer> inorderTraversal(TreeNode root)
{
List<Integer>order = new ArrayList<>(); //malloc一个数组空间,不需要指明空间大小
traversal(root,order); //不需要使用引用变量&val的耶
return order;
}
void traversal(TreeNode p, List<Integer> order)
{
if(p!=null) //java里不能直接用节点作boolean判断
{
if(p.left!=null) //不需要用指针
traversal(p.left,order);
order.add(p.val); //java的list还有这种操作的吗?
if(p.right!=null)
traversal(p.right,order);
}
}
}
//leetcode solution介绍了另一种方法: morris traversal
//通过改变树的形状,将左子树移至最右端,最后通过一路向右得到中序排列
solution2:
class Solution{
public List<Integer>inorderTraversal(TreeNode root)
{
List<Integer> order = new ArrayList<>();
TreeNode p =root;
TreeNode pre;
while(p!=null)
{
if(p.left == null)
{
order.add(p.val); //如果无左子节点,则将该节点加入数组
p = p.right; //向右移
}
else //有左节点
{
pre = p.left;
while(pre.right!=null)
pre = pre.right; //找到最右端的节点
pre.right = p; //将该节点放至树的最右端
TreeNode temp = p;
p = p.left; //代入下一个循环
temp.left = null; //将变动后的树的左节点删除
}
}
}
}
今日感想:C写算法是真的不好用,要慢慢拾起java了