【PAT】1043. Is It a Binary Search Tree (25)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;

	TreeNode(int val) {
		this.val = val;
		left = null;
		right = null;
	}
}

/**
 * BST,a节点左边的节点value都【小于】a,右边的节点【大于等于】a
 * a先序数组,b中序数组
 * 在BST(中序从小到大)中,当存在有重复元素的时候,在中序中应该第一个出现a[0]的位置
 * 而在BST镜像树中(中序从大到小),在中序中应该最后一个出现a[0]的位置
 * 
 * 故:在createTree和createTree1中,遍历b的顺序不同
 * for (i = bf; i <= bl; i++) 和for (i = bl; i >= bf; i--)区别
 *
 * 创建日期:2014年10月10日
 * @author chenshanfu
 */
public class Main {

	private static ArrayList<Integer> resultList = new ArrayList<Integer>();

	public static void postorderPrint(TreeNode root) {
		if (root != null) {
			if (root.left != null)
				postorderPrint(root.left);
			if (root.right != null)
				postorderPrint(root.right);
			resultList.add(root.val);
		}
	}

	// 从小到大
	public static boolean check(int[] a, int[] b, int af, int al, int bf, int bl) {
		int i, nextlen;
		if (al < af)
			return true;
		for (i = bf; i <= bl; i++) {
			if (b[i] == a[af]) {
				break;
			}
		}
		nextlen = i - bf;
		for (int j = af + 1; j <= al; j++) {
			if ((j <= af + nextlen && a[j] >= b[i])
					|| (j >= af + nextlen + 1 && a[j] < b[i])) {
				/*
				 * System.err.println("i="+i); System.err.println("j="+j);
				 */
				return false;
			}
		}
		return check(a, b, af + 1, af + nextlen, bf, bf + nextlen - 1)
				&& check(a, b, af + nextlen + 1, al, bf + nextlen + 1, bl);
	}

	// 从大到小
	public static boolean check1(int[] a, int[] b, int af, int al, int bf,
			int bl) {
		int i, nextlen;
		if (al < af)
			return true;
		for (i = bl; i >= bf; i--) {
			if (b[i] == a[af]) {
				break;
			}
		}
		nextlen = i - bf;
		for (int j = af + 1; j <= al; j++) {
			if ((j <= af + nextlen && a[j] < b[i])
					|| (j >= af + nextlen + 1 && a[j] >= b[i])) {
				return false;
			}
		}
		return check1(a, b, af + 1, af + nextlen, bf, bf + nextlen - 1)
				&& check1(a, b, af + nextlen + 1, al, bf + nextlen + 1, bl);
	}

	//从小到大创建树
	/**
	 * 
	 *
	 * @param a先序
	 * @param b中序
	 * @param af先序开始位置(包含)
	 * @param al先序结束位置(包含)
	 * @param bf中序开始位置(包含)
	 * @param bl中序结束位置(包含)
	 * @return
	 * 创建日期:2014年10月10日
	 * 修改说明:
	 * @author chenshanfu
	 */
	public static TreeNode createTree(int[] a, int[] b, int af, int al, int bf,
			int bl) {
		int i, nextlen;
		if (al < af)
			return null;
		TreeNode root = new TreeNode(a[af]);
		for (i = bf; i <= bl; i++) {
			if (b[i] == a[af]) {
				break;
			}
		}
		nextlen = i - bf;
		root.left = createTree(a, b, af + 1, af + nextlen, bf, bf + nextlen - 1);
		root.right = createTree(a, b, af + nextlen + 1, al, bf + nextlen + 1,
				bl);
		return root;
	}
	
	//从大到小创建树
	public static TreeNode createTree1(int[] a, int[] b, int af, int al, int bf,
			int bl) {
		int i, nextlen;
		if (al < af)
			return null;
		TreeNode root = new TreeNode(a[af]);
		for (i = bl; i >= bf; i--) {
			if (b[i] == a[af]) {
				break;
			}
		}
		nextlen = i - bf;
		root.left = createTree(a, b, af + 1, af + nextlen, bf, bf + nextlen - 1);
		root.right = createTree(a, b, af + nextlen + 1, al, bf + nextlen + 1,
				bl);
		return root;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		int[] a = new int[n];// preorder
		int[] b = new int[n];// inorder 从小到大
		int[] c = new int[n];// inorder 从大到小
		for (int i = 0; i < n; i++) {
			a[i] = input.nextInt();
		}
		for (int i = 0; i < n; i++) {
			b[i] = a[i];
		}
		Arrays.sort(b);
		for (int i = 0; i < n; i++) {
			c[i] = b[n - 1 - i];
		}
		/*System.err.println(check(a, b, 0, n - 1, 0, n - 1));
		System.err.println(check1(a, c, 0, n - 1, 0, n - 1));*/
		if (check(a, b, 0, n - 1, 0, n - 1)) {
			TreeNode rootNode = null;
			rootNode = createTree(a, b, 0, n - 1, 0, n - 1);
			postorderPrint(rootNode);
			System.out.println("YES");
			for (int i = 0; i < resultList.size(); i++) {
				if (i != resultList.size() - 1)
					System.out.print(resultList.get(i) + " ");
				else
					System.out.println(resultList.get(i));
			}
		} else if (check1(a, c, 0, n - 1, 0, n - 1)) {
			TreeNode rootNode = null;
			rootNode = createTree1(a, c, 0, n - 1, 0, n - 1);
			postorderPrint(rootNode);
			System.out.println("YES");
			for (int i = 0; i < resultList.size(); i++) {
				if (i != resultList.size() - 1)
					System.out.print(resultList.get(i) + " ");
				else
					System.out.println(resultList.get(i));
			}
		} else {
			System.out.println("NO");
		}
	}
}

【Solution】 To convert a binary search tree into a sorted circular doubly linked list, we can use the following steps: 1. Inorder traversal of the binary search tree to get the elements in sorted order. 2. Create a doubly linked list and add the elements from the inorder traversal to it. 3. Make the list circular by connecting the head and tail nodes. 4. Return the head node of the circular doubly linked list. Here's the Python code for the solution: ``` class Node: def __init__(self, val): self.val = val self.prev = None self.next = None def tree_to_doubly_list(root): if not root: return None stack = [] cur = root head = None prev = None while cur or stack: while cur: stack.append(cur) cur = cur.left cur = stack.pop() if not head: head = cur if prev: prev.right = cur cur.left = prev prev = cur cur = cur.right head.left = prev prev.right = head return head ``` To verify the accuracy of the code, we can use the following test cases: ``` # Test case 1 # Input: [4,2,5,1,3] # Output: # Binary search tree: # 4 # / \ # 2 5 # / \ # 1 3 # Doubly linked list: 1 <-> 2 <-> 3 <-> 4 <-> 5 # Doubly linked list in reverse order: 5 <-> 4 <-> 3 <-> 2 <-> 1 root = Node(4) root.left = Node(2) root.right = Node(5) root.left.left = Node(1) root.left.right = Node(3) head = tree_to_doubly_list(root) print("Binary search tree:") print_tree(root) print("Doubly linked list:") print_list(head) print("Doubly linked list in reverse order:") print_list_reverse(head) # Test case 2 # Input: [2,1,3] # Output: # Binary search tree: # 2 # / \ # 1 3 # Doubly linked list: 1 <-> 2 <-> 3 # Doubly linked list in reverse order: 3 <-> 2 <-> 1 root = Node(2) root.left = Node(1) root.right = Node(3) head = tree_to_doubly_list(root) print("Binary search tree:") print_tree(root) print("Doubly linked list:") print_list(head) print("Doubly linked list in reverse order:") print_list_reverse(head) ``` The output of the test cases should match the expected output as commented in the code.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值