1. Python实现

  1. class TreeNode:
  2. def __init__(self, x):
  3. self.val = x
  4. self.left = None
  5. self.right = None
  6. class Solution:
  7. def __init__(self):
  8. self.res = []
  9. # 先序遍历
  10. def getPreOrder(self, root):
  11. # 递归法
  12. def preOrderRec(root):
  13. if not root:
  14. return None
  15. # 根左右
  16. self.res.append(root.val)
  17. preOrderRec(root.left)
  18. preOrderRec(root.right)
  19. # 迭代法
  20. # 1) 弹出打印
  21. # 2) 如有右,压入右
  22. # 3) 如有左,压入左
  23. def preOrderIter(root):
  24. if not root: self.res = []
  25. stack = [root]
  26. while stack:
  27. root = stack.pop()
  28. self.res.append(root.val)
  29. if root.right: stack.append(root.right)
  30. if root.left: stack.append(root.left)
  31. # preOrderRec(root)
  32. preOrderIter(root)
  33. # 后续遍历
  34. def getPostOrder(self, root):
  35. def postOrderRec(root):
  36. if not root:
  37. return None
  38. postOrderRec(root.left)
  39. postOrderRec(root.right)
  40. self.res.append(root.val)
  41. # 迭代法
  42. # 1) 弹出打印
  43. # 2) 如有左,压入、左
  44. # 3) 如有右,压入右
  45. def postOrderIter(root):
  46. if not root: self.res = []
  47. stack = [root]
  48. while stack:
  49. self.res.append(root.val)
  50. root = stack.pop()
  51. if root.left: stack.append(root.left)
  52. if root.right: stack.append(root.right)
  53. # postOrderRec(root)
  54. postOrderIter(root)
  55. # 中序遍历
  56. def getInOrder(self, root):
  57. def inOrderRec(root):
  58. if not root:
  59. return None
  60. inOrderRec(root.left)
  61. self.res.append(root.val)
  62. inOrderRec(root.right)
  63. # 迭代法
  64. # 1) 整条左边界入栈
  65. # 2) 如果 1) 无法进行,弹出打印
  66. # 3) 右边界入栈
  67. def inOrderIter(root):
  68. if not root: self.res = []
  69. stack = []
  70. while stack or root:
  71. if root:
  72. stack.append(root)
  73. root = root.left
  74. else:
  75. node = stack.pop()
  76. self.res.append(node.val)
  77. root = node.right
  78. # inOrderRec(root)
  79. inOrderIter(root)
  80. # 层序遍历
  81. def bfs(self, root):
  82. if not root: self.res = []
  83. queue = [root]
  84. while queue:
  85. nextLayer = []
  86. for node in queue:
  87. self.res.append(node.val)
  88. if node.left:
  89. nextLayer.append(node.left)
  90. if node.right:
  91. nextLayer.append(node.right)
  92. queue = nextLayer
  93. if __name__ == "__main__":
  94. node1 = TreeNode('A')
  95. node2 = TreeNode('B')
  96. node3 = TreeNode('C')
  97. node4 = TreeNode('D')
  98. node5 = TreeNode('E')
  99. node6 = TreeNode('F')
  100. node7 = TreeNode('G')
  101. node8 = TreeNode('H')
  102. node9 = TreeNode('I')
  103. node1.left = node2
  104. node1.right = node3
  105. node2.left = node4
  106. node2.right = node5
  107. node3.left = node6
  108. node3.right = node7
  109. node4.left = node8
  110. node4.right = node9
  111. s = Solution()
  112. s.getPreOrder(node1)
  113. print (s.res) # ['A', 'B', 'D', 'H', 'I', 'E', 'C', 'F', 'G']
  114. # s.getInOrder(node1)
  115. # print (s.res) # ['H', 'D', 'I', 'B', 'E', 'A', 'F', 'C', 'G']
  116. # s.getPostOrder(node1)
  117. # print (s.res[::-1]) # ['H', 'I', 'D', 'E', 'B', 'F', 'G', 'C', 'A']
  118. # s.bfs(node1)
  119. # print (s.res) # ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

2. Java实现

  1. import java.util.*;
  2. /**
  3. * @Author dyliang
  4. * @Date 2020/10/7 21:22
  5. * @Version 1.0
  6. */
  7. public class BinaryTree {
  8. public static void main(String[] args) {
  9. TreeNode root = new TreeNode(1);
  10. root.left = new TreeNode(2);
  11. root.right = new TreeNode(3);
  12. root.left.left = new TreeNode(4);
  13. root.left.right = new TreeNode(5);
  14. root.left.left.left = new TreeNode(8);
  15. root.left.left.right = new TreeNode(9);
  16. root.right.left = new TreeNode(6);
  17. root.right.right = new TreeNode(7);
  18. System.out.println("---------recursive---------");
  19. preOrderRecur(root);
  20. System.out.println();
  21. System.out.println("---------------------");
  22. inOrderRecur(root);
  23. System.out.println();
  24. System.out.println("---------------------");
  25. postOrderRecur(root);
  26. System.out.println();
  27. System.out.println("---------Iteration---------");
  28. preOrderIter(root);
  29. System.out.println();
  30. System.out.println("---------------------");
  31. inOrderIter(root);
  32. System.out.println();
  33. System.out.println("---------------------");
  34. postOrderIter(root);
  35. System.out.println();
  36. System.out.println("---------------------");
  37. levelOrder(root);
  38. /**
  39. * ---------recursive---------
  40. * 1 2 4 8 9 5 3 6 7
  41. * ---------------------
  42. * 8 4 9 2 5 1 6 3 7
  43. * ---------------------
  44. * 8 9 4 5 2 6 7 3 1
  45. * ---------Iteration---------
  46. * 1 2 4 8 9 5 3 6 7
  47. * ---------------------
  48. * 8 4 9 2 5 1 6 3 7
  49. * ---------------------
  50. * 8 9 4 5 2 6 7 3 1
  51. * ---------------------
  52. * 1 2 3 4 5 6 7 8
  53. */
  54. }
  55. public static class TreeNode{
  56. int val;
  57. TreeNode left;
  58. TreeNode right;
  59. public TreeNode(int val) {
  60. this.val = val;
  61. }
  62. public TreeNode() {
  63. }
  64. }
  65. /**
  66. * 递归方式的先序遍历
  67. * @param root
  68. */
  69. public static void preOrderRecur(TreeNode root){
  70. if(root == null){
  71. return;
  72. }
  73. System.out.print(root.val + " ");
  74. preOrderRecur(root.left);
  75. preOrderRecur(root.right);
  76. }
  77. /**
  78. * 递归方式的中序遍历
  79. * @param root
  80. */
  81. public static void inOrderRecur(TreeNode root){
  82. if(root == null){
  83. return;
  84. }
  85. inOrderRecur(root.left);
  86. System.out.print(root.val + " ");
  87. inOrderRecur(root.right);
  88. }
  89. /**
  90. * 递归方式的后续遍历
  91. * @param root
  92. */
  93. public static void postOrderRecur(TreeNode root){
  94. if(root == null){
  95. return;
  96. }
  97. postOrderRecur(root.left);
  98. postOrderRecur(root.right);
  99. System.out.print(root.val + " ");
  100. }
  101. /**
  102. * 迭代方式的先序遍历
  103. * @param root
  104. */
  105. public static void preOrderIter(TreeNode root){
  106. if(root == null){
  107. return;
  108. }
  109. Stack<TreeNode> stack = new Stack<>();
  110. stack.push(root);
  111. while(!stack.isEmpty()){
  112. TreeNode node = stack.pop();
  113. System.out.print(node.val + " ");
  114. if(node.right != null){
  115. stack.push(node.right);
  116. }
  117. if(node.left != null){
  118. stack.push(node.left);
  119. }
  120. }
  121. }
  122. /**
  123. * 迭代方式的后序遍历
  124. * @param root
  125. */
  126. public static void postOrderIter(TreeNode root){
  127. if(root == null){
  128. return;
  129. }
  130. Stack<TreeNode> stack = new Stack<>();
  131. List<Integer> list = new ArrayList<>();
  132. stack.push(root);
  133. while(!stack.isEmpty()){
  134. TreeNode node = stack.pop();
  135. list.add(node.val);
  136. if(node.left != null){
  137. stack.push(node.left);
  138. }
  139. if(node.right != null) {
  140. stack.push(node.right);
  141. }
  142. }
  143. Collections.reverse(list);
  144. for (Integer i : list) {
  145. System.out.print(i + " ");
  146. }
  147. }
  148. /**
  149. * 迭代方式的中序遍历
  150. * @param root
  151. */
  152. public static void inOrderIter(TreeNode root){
  153. if(root == null){
  154. return;
  155. }
  156. Stack<TreeNode> stack = new Stack<>();
  157. while (!stack.isEmpty() || root != null){
  158. if(root != null){
  159. stack.push(root);
  160. root = root.left;
  161. } else {
  162. root = stack.pop();
  163. System.out.print(root.val + " ");
  164. root = root.right;
  165. }
  166. }
  167. }
  168. /**
  169. * 层序遍历
  170. * @param root
  171. */
  172. public static void levelOrder(TreeNode root){
  173. Queue<TreeNode> queue = new LinkedList<>();
  174. queue.add(root);
  175. while (!queue.isEmpty()){
  176. Queue<TreeNode> next = new LinkedList<>();
  177. for (TreeNode node : queue) {
  178. if(node != null){
  179. System.out.print(node.val + " ");
  180. if(root.left != null){
  181. next.add(node.left);
  182. }
  183. if(root.right != null){
  184. next.add(node.right);
  185. }
  186. }else{
  187. return;
  188. }
  189. }
  190. queue = next;
  191. }
  192. }
  193. }