二叉树练习题(一) 二叉树的遍历

女爷i 2023-06-02 09:11 20阅读 0赞

在这里插入图片描述
练习题1:如何根据二叉树的遍历结果重置二叉树:
对于先序遍历我们知道,最先出现的一般是根节点,而中序遍历一般将根节点出现在中间,后序遍历将跟节点出现在最后,我们可以根据根节点所在为止划分子树,然后重置二叉树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例题1:对于上述二叉树,请实现层次遍历、先序遍历、中序遍历和后序遍历

  1. '''
  2. 二叉树的遍历
  3. 将以下二叉树分别用先序遍历、中序遍历、后序遍历和层次遍历进行遍历
  4. 0
  5. 1 2
  6. 3 4 5 6
  7. 7 8 9
  8. 先序遍历:中左右
  9. 中序遍历:左中右
  10. 后序遍历:左右中
  11. '''
  12. class TreeNode:
  13. def __init__(self, x):
  14. self.val = x
  15. self.left=None
  16. self.right=None
  17. #生成二叉树
  18. node_0=TreeNode(0)
  19. node_1=TreeNode(1)
  20. node_2=TreeNode(2)
  21. node_3=TreeNode(3)
  22. node_4=TreeNode(4)
  23. node_5=TreeNode(5)
  24. node_6=TreeNode(6)
  25. node_7=TreeNode(7)
  26. node_8=TreeNode(8)
  27. node_9=TreeNode(9)
  28. node_0.left=node_1
  29. node_0.right=node_2
  30. node_1.left=node_3
  31. node_1.right=node_4
  32. node_2.left=node_5
  33. node_2.right=node_6
  34. node_3.left=node_7
  35. node_3.right=node_8
  36. node_4.left=node_9
  37. #前序遍历
  38. def priosearch(head):
  39. if head==None:
  40. return
  41. print(head.val,end=' ')
  42. priosearch(head.left)
  43. priosearch(head.right)
  44. priosearch(node_0)
  45. #0 1 3 7 8 4 9 2 5 6
  46. #中序遍历
  47. def midsearch(head):
  48. if head==None:
  49. return
  50. midsearch(head.left)
  51. print(head.val,end=' ')
  52. midsearch(head.right)
  53. midsearch(node_0)
  54. #7 3 8 1 9 4 0 5 2 6
  55. #后序遍历
  56. def backsearch(head):
  57. if head==None:
  58. return
  59. backsearch(head.left)
  60. backsearch(head.right)
  61. print(head.val,end=' ')
  62. backsearch(node_0)
  63. #层次遍历,利用队列的方式去遍历
  64. def cengcisearch(head):
  65. arr=[]
  66. arr.append(head)
  67. while arr:
  68. c_root=arr.pop(0)
  69. print(c_root.val,end=' ')
  70. if c_root.left is not None:
  71. arr.append(c_root.left)
  72. if c_root.right is not None:
  73. arr.append(c_root.right)
  74. cengcisearch(node_0)
  75. #0 1 2 3 4 5 6 7 8 9

习题2:剑指offer32
按层打印二叉树,从上到下从左向右
在这里插入图片描述

  1. '''
  2. 从上至下层次打印二叉树
  3. 如:
  4. 8
  5. 6 10
  6. 5 7 9 11
  7. '''
  8. class TreeNode:
  9. def __init__(self, x):
  10. self.val = x
  11. self.left = None
  12. self.right = None
  13. Node1=TreeNode(8)
  14. Node2=TreeNode(6)
  15. Node3=TreeNode(10)
  16. Node4=TreeNode(5)
  17. Node5=TreeNode(7)
  18. Node6=TreeNode(9)
  19. Node7=TreeNode(11)
  20. Node1.left=Node2
  21. Node1.right=Node3
  22. Node2.left=Node4
  23. Node2.right=Node5
  24. Node3.left=Node6
  25. Node3.right=Node7
  26. head=Node1
  27. def cenciprint(head):
  28. if head is None:
  29. return
  30. list1=[] #当前节点要打印的元素
  31. list2=[] #将节点弹出的下一层节点暂时存储的数组
  32. list1.append(head)
  33. while list1 or list2:
  34. while list1:
  35. c_root=list1.pop(0)
  36. list2.append(c_root)
  37. #此时list2已经将这一层节点全部存储了
  38. while list2:
  39. #将这一层的节点全部打印,并将当前节点的左右节点放入list1中
  40. root=list2.pop(0)
  41. print(root.val,end=' ')
  42. if root.left is not None:
  43. list1.append(root.left)
  44. if root.right is not None:
  45. list1.append(root.right)
  46. print('\n')
  47. cenciprint(Node1)

解析:使用两个list来实现,首先放入根节点,将根节点的所有子节点遍历并放入list2,从最开始的元素从list2依次弹出,每次打印这个元素,并将其加入list1,相当于在list1进行出栈并添加子树时,先将子树存储起来以防止不断出栈,这样list2中每次存储的都是每一层的所有元素,当两个list1、list2都为空时代表已经全部遍历结束。
习题3:之字形打印二叉树
在这里插入图片描述

  1. '''
  2. 之字形打印二叉树
  3. 1
  4. 2 3
  5. 4 5 6 7
  6. 8 9 10 11 12 13 14 15
  7. 打印出来的结果:
  8. 1
  9. 3 2
  10. 4 5 6 7
  11. 15 14 13 12 11 10 9 8
  12. '''
  13. ##测试:来回打印
  14. Node1=TreeNode(1)
  15. Node2=TreeNode(2)
  16. Node3=TreeNode(3)
  17. Node4=TreeNode(4)
  18. Node5=TreeNode(5)
  19. Node6=TreeNode(6)
  20. Node7=TreeNode(7)
  21. Node8=TreeNode(8)
  22. Node9=TreeNode(9)
  23. Node10=TreeNode(10)
  24. Node11=TreeNode(11)
  25. Node12=TreeNode(12)
  26. Node13=TreeNode(13)
  27. Node14=TreeNode(14)
  28. Node15=TreeNode(15)
  29. Node16=TreeNode(16)
  30. Node1.left=Node2
  31. Node1.right=Node3
  32. Node2.left=Node4
  33. Node2.right=Node5
  34. Node3.left=Node6
  35. Node3.right=Node7
  36. Node4.left=Node8
  37. Node4.right=Node9
  38. Node5.left=Node10
  39. Node5.right=Node11
  40. Node6.left=Node12
  41. Node6.right=Node13
  42. Node7.left=Node14
  43. Node7.right=Node15
  44. def zhizi_print(head,right_left_triger=False):
  45. if head is None:
  46. return
  47. list1=[] #临时存储下一层节点的值,以队列的形式存储,后面进,前面出
  48. list2=[] #存储当前节点要打印的值
  49. list1.append(head)
  50. while list1 or list2:
  51. while list1:
  52. c_root=list1.pop(0)
  53. list2.append(c_root)
  54. while list2:
  55. if right_left_triger==True:#从右向左打印
  56. root=list2.pop()
  57. print(root.val,end=' ')
  58. if root.right is not None:
  59. list1.append(root.right)
  60. if root.left is not None:
  61. list1.append(root.left)
  62. #此时list1中存储的元素也是从右往左的所以需要将list1颠倒
  63. #list1=list1[::-1]
  64. else: #从左向右打印
  65. root=list2.pop(0)
  66. print(root.val,end=' ')
  67. if root.left is not None:
  68. list1.append(root.left)
  69. if root.right is not None:
  70. list1.append(root.right)
  71. #arr=[i.val for i in list1]
  72. #print(arr)
  73. if right_left_triger==True:
  74. right_left_triger=False
  75. list1=list1[::-1]
  76. else:
  77. right_left_triger=True
  78. print('\n')
  79. zhizi_print(Node1)

在这里插入图片描述
在上一道每行打印二叉树的基础上进行修改,从左到右和从右到左只需改变list2的弹出顺序,即一个弹出最前面的元素,一个弹出最右边的元素,每次循环完成后改变left的值,如果left时True改为False,如果是False改为True.
习题4:判断二叉树是否为满二叉树
首先完全二叉树树的定义是,加入一个二叉树有h层,除了h层外,其余h-1层均满二叉树状态,第h层所有的节点均从最左边开始生长。

发表评论

表情:
评论列表 (有 0 条评论,20人围观)

还没有评论,来说两句吧...

相关阅读