语言逻辑 TO 代码

总结一些语言转换成代码的练习

二叉树

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;

方法二:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值