将搜索二叉树转换成双向链表

将搜索二叉树转换成双向链表

问题重述:

给与一颗搜索二叉树,将其转换为一个有序的双向链表,并将链表的头返回
例如:

将搜索二叉树转换成双向链表

这棵搜索二叉树转换后的双向链表从头到尾依次是1~9。对每一个节点来说,原来的right指针等价于转换后的next 指针,原来的left 指针等价于转换后的last 指针,最后返回转换后的双向链表头节点

问题分析:

方法一:二叉树转化后的双向链表顺序和二叉树的中序遍历顺序一样,我们可以先中序遍历二叉树,将得到的每一个结点保存起来(先进的先出,所以使用队列最合适),然后遍历队列将每一个结点弹出来并且相互连接

解题:

代码:
方法一:二叉树的遍历
public static Node convertTree1(Node head) {
		Queue<Node> queue = new LinkedList<Node>();
		inorderToQueue(head,queue);
		if(queue.isEmpty()) {
			return head;
		}
		head = queue.poll();
		Node pre = head;
		Node next = null;
		Node cur = null;
		while(!queue.isEmpty()) {
			cur = queue.poll();
			pre.right = cur;
			cur.left = pre;
			pre = cur;
		}
		pre.right = null;
		return head;
		
	}
	public static void inorderToQueue(Node head,Queue<Node> queue) {
		if(head == null) {
			return;
		}
		inorderToQueue(head.left,queue);
		queue.offer(head);
		inorderToQueue(head.right,queue);
		
	}

代码解析:使用递归的方式来对二叉树进行遍历

总结:

二叉树的遍历:

二叉树有四种遍历方式,分别是前序遍历、中序遍历、后序遍历和层次遍历

前序遍历:顺序为根节点、左节点、右节点

中序遍历:顺序为左节点、根节点、右节点

后序遍历:顺序为左节点、右节点、根节点

层次遍历:从上往下一层一层遍历,同一层按照从左往右的顺序

遍历二叉树最简单的实现方法是使用递归的方式:

// 递归实现
public static void inorderToQueue(Node head) {
		if(head == null) {
			return;
		}
    	// 按照顺序来,现在使用的是中序遍历,顺序为左、根、右,如果想要使用其他遍历方式,就改变顺序即可
		inorderToQueue(head.left);
		// 对当前结点你要做的操作
		inorderToQueue(head.right);
		
	}

遍历二叉树也可以不使用递归方式,但是会比较麻烦,需要特别注意结点是否为空,一般前中后三种遍历方式都需要使用栈来操作,层次遍历使用队列进行辅助操作

上一篇:【C++从青铜到王者】第十篇:STL之vector类的模拟实现


下一篇:java 判断一个字符串中的数字:是否为数字、是否包含数字、截取数字