• 二叉树练习


    二叉树的遍历方式:

    前序遍历:根结点 ---> 左子树 ---> 右子树

    1. if (root != null) {
    2. System.out.print(root.val);
    3. preOrderTraverse1(root.left);
    4. preOrderTraverse1(root.right);
    5. }

    中序遍历:左子树---> 根结点 ---> 右子树

    1. if (root != null) {
    2. preOrderTraverse1(root.left);
    3. System.out.print(root.val);
    4. preOrderTraverse1(root.right);
    5. }

    后序遍历:左子树 ---> 右子树 ---> 根结点

    1. if (root != null) {
    2. preOrderTraverse1(root.left);
    3. preOrderTraverse1(root.right);
    4. System.out.print(root.val);
    5. }

    栈的方式:

    首先要注意栈是一端先进后出的容器,比方说我们进行先序遍历,我们并不是按照中,左右的方式入栈,但是我们会按照该方式出栈。

    1. //先序
    2. public void preOrderTraverse2(TreeNode root) {
    3. LinkedList stack = new LinkedList<>();
    4. TreeNode pNode = root;
    5. while (pNode != null || !stack.isEmpty()) {
    6. if (pNode != null) {
    7. System.out.print(pNode.val+" ");
    8. stack.push(pNode);
    9. pNode = pNode.left;
    10. } else { //pNode == null && !stack.isEmpty()
    11. TreeNode node = stack.pop();
    12. pNode = node.right;
    13. }
    14. }
    15. }
    16. //中序
    17. public void inOrderTraverse2(TreeNode root) {
    18. LinkedList stack = new LinkedList<>();
    19. TreeNode pNode = root;
    20. while (pNode != null || !stack.isEmpty()) {
    21. if (pNode != null) {
    22. stack.push(pNode);
    23. pNode = pNode.left;
    24. } else { //pNode == null && !stack.isEmpty()
    25. TreeNode node = stack.pop();
    26. System.out.print(node.val+" ");
    27. pNode = node.right;
    28. }
    29. }
    30. }
    31. //后序
    32. public void levelTraverse(TreeNode root) {
    33. if (root == null) {
    34. return;
    35. }
    36. LinkedList queue = new LinkedList<>();
    37. queue.offer(root);
    38. while (!queue.isEmpty()) {
    39. TreeNode node = queue.poll();
    40. System.out.print(node.val+" ");
    41. if (node.left != null) {
    42. queue.offer(node.left);
    43. }
    44. if (node.right != null) {
    45. queue.offer(node.right);
    46. }
    47. }
    48. }

    判断二叉树的层情况:

     性质1 : 二叉树的第 i 层上至多有 2^(i-1) 个结点 (i>=1)

     性质2 :  深度为 k 的二叉树至多有 2^k -1 个结点( k>=1)

     性质3 :  对任意的一颗二叉树 T ,若叶子结点数为 n0,而其度数为 2 的结点数为 n2,则 n0 =                            n2+1

     性质4 :  具有 n 个结点的完全二叉树的深度 [log2n]+1

     性质 5:  如果有一颗有n个节点的完全二叉树的节点按层次序编号,对任一层的节点i(1<=i<=n)有

                            (1).如果i=1,则节点是二叉树的根,无双亲,如果i>1,则其双亲节点为[i/2],向下                                  取整

                            (2).如果2i>n那么节点i没有左孩子,否则其左孩子为2i

                            (3).如果2i+1>n那么节点没有右孩子,否则右孩子为2i+1
    原文链接:https://blog.csdn.net/fsfsfsdfsdfdr/article/details/82454981

     

     

    二叉搜索树又称二叉排序树,具有以下性质:

    • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
    • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
    • 它的左右子树也分别为二叉搜索树

    注意:中序遍历二叉搜索树是有序的。

    1.力扣 验证二叉搜索树

     1.1递归

    上下界的概念,对于左子树来说,根节点就是上界,而相反,对于右子树来说,根节点是下界。

    1. class Solution {
    2. public boolean isValidBST(TreeNode root) {
    3. return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
    4. }
    5. public boolean isValidBST(TreeNode node, long lower, long upper) {
    6. if (node == null) {
    7. return true;
    8. }
    9. if (node.val <= lower || node.val >= upper) {
    10. return false;
    11. }
    12. return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);
    13. }
    14. }

  • 相关阅读:
    Java环境变量学习
    Android11 桌面默认横屏导致任务键近期任务布局UI显示错误!
    一篇万字博文带你入坑爬虫这条不归路 【万字图文】
    实例解读:Python量化分析在投资中的应用
    长连接和短连接有什么区别?
    使用 sklearn 进行数学建模的通用模板
    mysql求当月有多少天
    蓝桥杯刷题(八)
    CesiumForUnreal之UE世界坐标与WGS84经纬度坐标转换原理与应用
    经常散步好不好?60以上老人3个好处收入囊中,但有3点要注意
  • 原文地址:https://blog.csdn.net/weixin_45799228/article/details/126409157