总结一些语言转换成代码的练习
二叉树
1,cur 是当前的节点,找到cur左子树的最右边的节点
所谓的最右边的节点,指的 位置上是右边,“左左右” 与“‘左右左’ 那个更加是右边呢?
我们认为是 左右左,因为其前面两位都是左边的
变量 cur , 左子树的最右节点 mostRight
Node c = cur.left;
while(c.right !=null){
c = c.right;
}
if(c.left != null){
return c.left;
}else{
return c;
}
分析: 二叉树左子树为空,右子树也为空。因此后面的if else 是不需要的; c可能是空,因为此时直接返回cur.
Node c = cur.left;
if(c == null){
mostright = null;
}else{
while(c.right != null){ // 返回条件是c.right =null c如果已经满足条件,那么就直接进来。
c = c.right;
}
mostright = c;
}
2, 用栈对二叉树进行遍历-- 后序遍历
- 申请一个栈,记为s1,然后将头节点head压入s1中
- 从s1中弹出的节点记为cur,然后依次将cur的左孩子节点和右孩子节点压入s1中,
- 在整个过程中,每一个从s1中弹出的节点都放入s2中
- 不断重复步骤2和步骤3, 直到s1为空,过程停止
- 从s2中依次弹出节点并打印
请将第二步 和 第三步 实现出来。
Node cur = s1.pop();
s1.push(cur.left);
s1.push(cur.right);
s2.push(cur)
实现 第二 第三 第四步
Stack s1 = new Stack();
Stack s2 = new Stack();
s1.push(head);
while(s1!=null){
Node cur = s1.pop();
if(cur!=null && cur.left !=null){
s1.push(cur.left);
s1.push(cur.right);
}
s2.push(cur);
}
// print the test data
while(s2!=null){
Node z = s2.pop();
System.out.println(z);
}
链表
合并链表
1, 如果两个链表中一个为空,说明无须合并,返回另一个链表的头节点即可
2,比较head1和head2的值,小的节点也是合并后链表的最小节点,这个节点无疑应该是合并链表的头节点,记为head;之后的步骤里,哪个链表的头节点值更小,另一个链表所有节点都会依次插入到这个链表 中。
3, 不妨设head节点所在的链表为1,另一个链表为链表2. 链表1和链表2都是从头部开始一起遍历的,比较每次遍历到的两个节点的值,记为cur1和cur2,然后根据大小关系做出不同的调整,同时用一个变量pre表示上次比较时值较小的节点。
请实现插入的操作,head表示已经排好的最后的节点,cur1 cur2 表示当前的candidate
Node next = null;
if(cur1.value<=cur2.value){
//head.next =cur1; //这是本身就存在的,因此这部是不需要的。
head = head.next; // 也可以写成 head = cur1, 两者等价 //更新
cur1 = cur1.next; //更新
}else{
next = cur2.next; //保存
head.next = cur2; //插入
cur2.next = cur1;
head = head.next; // 更新
cur2 = next; //更新
}
左右半区单链表
假设连败的长度是N ,直接给出时间复杂度为O(N),额外的空间复杂度为O(1)。 具体的过程如下:
- 如果链表为空或长度为1,不用调整,过程直接结束
- 链表长度大于1时,遍历一遍找到左半区的最后一个节点,记为mid
- 遍历一遍找到mid之后,将左半区与右半区分离成两个链表(mid.next=null),分别记为left 和 right
- 将两个链表按照题目要求合并起来。
找到左半区的最后一个节点
初始的记为 head
方法一:
//遍历一遍 算出长度
int n =0;
Node cur = head;
while(cur!=null){
n++;
cur = cur.next;
}
int mid = n/2;
// 根据Mid ,递减找到mid的点
cur = head;
Node left = null;
Node right = null;
while(mid>0){
cur = cur.next;
mid --;
}
right = mid.next;
left = head;
方法二: