题目描述
解题思路
那么有序的元素如果求累加呢?
其实这就是一棵树,大家可能看起来有点别扭,换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13],是不是感觉这就简单了。
为什么变成数组就是感觉简单了呢?
因为数组大家都知道怎么遍历啊,从后向前,挨个累加就完事了,这换成了二叉搜索树,看起来就别扭了一些是不是。
那么知道如何遍历这个二叉树,也就迎刃而解了,从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。
也就是反中序遍历,在依次累加,注意使用pre来记录上一个节点。
递归法
/*** 递归法** @param root* @return*/public TreeNode convertBST(TreeNode root) {return traversal(root);}int pre = 0; // 记录上一个节点的值// 反中序遍历(右左中)public TreeNode traversal(TreeNode root) {if (root == null) return null;traversal(root.right);root.val += pre;pre = root.val;traversal(root.left);return root;}
迭代法
/*** 迭代法** @param root* @return*/public TreeNode convertBST(TreeNode root) {if (root == null) return null;Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;int pre = 0;while (cur != null || !stack.isEmpty()) {if (cur != null) {stack.push(cur);cur = cur.right;}else {cur = stack.pop();cur.val += pre;pre = cur.val;cur = cur.left;stack.push(cur);}}return root;}
