面向面试题学习(1) 2019-6-2

  1. 500和505的WEB错误码
  2. 二叉树的翻转算法

1. 500和505的WEB错误码

500

服务器500错误。500错误的出现原因是很多的,但是你要知道,500错误是服务器内部错误,而且一般程序上是ASP错误为多的,可能是你的用户权限的问题导致,或者是数据库连接出现了错误,那么要好好检查下服务器语句错误问题。

501

服务器501错误。服务器501错误是服务器还是不具有请求功能的,而且501错误原因是没有实施的,可以用来HttpWebRequest指定一个UserAgent来试试的,有时候你可以换电脑来测试一下的。

502

服务器502错误。这是服务器上的一个错误网关 ,因此说它是无效的,我们在出现了服务器502错误问题的时候,最好是先清除下缓存或者是在服务器上进行刷新试试的,因为502错误牵扯的问题也是很多的,最好是让程序们来去在服务器上下文章。

503

服务器503错误。服务不可用是的一种状态,那么在服务器503错误出现了之后,大家不必担心的, 服务器或许就是正在维护或者暂停了,你可以联系一下服务器空间商。还有的时候cpu占用的频率大导致的。

504

服务器504错误。这是代表着网关超时是现象出现了。504错误问题是一个不好办的问题,当然你必须尝试着和网站官方获得联系,认真的去检查不同的电脑简的ip传输的状况。而且这个504错误要专业的负责人才能去解决。

505

服务器505错误。http的版本是不受支持的,一般的请款下浏览器的默认都是1.x 的版本的, 如果出现了HTTP 1.1版本的,那么你需要在Internet 选项的高级下进行设置的。

2. 二叉树的翻转算法

英文题解地址 invert-binary-tree

方法一:递归

这是一个经典的树问题,最适合递归方法。

算法

空树翻转之后还是空树。根节点(root)的左子节点及其所有的子孙节点构成根节点的左子树(left subtree),同样的,根节点(root)的右子节点及其所有的子孙节点构成根节点的右子树(right subtree)。因此翻转一个二叉树,就是把根节点的左子树翻转一下,同样的把右子树翻转一下,在交换左右子树就可以了。

1
2
3
4
5
6
7
8
9
10
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode right = invertTree(root.right);
TreeNode left = invertTree(root.left);
root.left = right;
root.right = left;
return root;
}

复杂度分析

  • 时间复杂度:O(n),由于树中的每个节点仅被访问一次,因此时间复杂度为O(n),其中n是树中的节点数。我们不能做得更好,因为我们必须访问每个节点来反转它。。
  • 空间复杂度:O(n),由于递归,在最坏的情况下,O(h)函数调用将被放置在堆上,其中h是树的高度。因为在 h ∈ O(n),所以空间复杂度是O(n)

方法二:迭代

或者,我们可以以类似于广度优先搜索的方式迭代地解决问题

算法

我们的想法是,我们需要交换树中所有节点的左右子节点。因此,我们创建一个队列来存储其左右孩子尚未交换的节点。最初,只有根位于队列中。只要队列不为空,就从队列中取出下一个节点,交换其子节点,然后将子节点添加到队列中。空节点不添加到队列中。最终,队列将为空并且所有子项都交换,我们返回原始根。

  • 使用队列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
// LinkedList实现了集合框架的Queue接口
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root); // 加入元素
while (!queue.isEmpty()) {
// 获取并移出元素
TreeNode current = queue.poll();

//交换左右子树
TreeNode temp = current.left;
current.left = current.right;
current.right = temp;

//左子树不为空,将左子树入栈
if (current.left != null) queue.add(current.left);
//右子树不为空,将右子树入栈
if (current.right != null) queue.add(current.right);
}
return root;
}
  • 使用栈
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;

Stack<TreeNode> stack = new Stack<>();
stack.push(root);//先将根节点压入堆栈
while (stack.size() > 0) {
//根据栈的先进后出操作,获取栈中最后一个元素,即最先入栈的元素
TreeNode temp = stack.lastElement();
stack.pop();//弹出栈顶元素

//交换左右子树
TreeNode tempLeft = temp.left;
temp.left = temp.right;
temp.right = tempLeft;

//左子树不为空,将左子树入栈
if (temp.left != null) {
stack.push(temp.left);
}
//右子树不为空,将右子树入栈
if (temp.right != null) {
stack.push(temp.right);
}
}
return root;
}

复杂度分析

  • 时间复杂度:O(n),由于树中的每个节点仅被访问 / 添加到队列一次,因此时间复杂度为O(n),其中n是树中的节点数。
  • 空间复杂度:O(n),因为在最坏的情况下,队列将包含二叉树的一个级别中的所有节点。对于完整的二叉树,叶级别为⌈n/2⌉=O(n) 。

Analysis written by: @noran

注意

翻译的可能不够准确,请在下面的评论中批评指正。

参考

http://www.voidcn.com/article/p-sjjaskjk-u.html

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信