递归遍历(前序)

https://leetcode-cn.com/problems/binary-tree-preorder-traversal/

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * struct TreeNode *left;
  6. * struct TreeNode *right;
  7. * };
  8. */
  9. int* preorderTraversal(struct TreeNode* root, int* returnSize){
  10. int* result = (int *)malloc(100 * sizeof(int));
  11. * returnSize = 0;
  12. traversal(root, returnSize, result);
  13. return result;
  14. }
  15. void traversal(struct TreeNode* root, int* p, int* result){
  16. if(root){
  17. *(result + *p) = root->val;
  18. (*p)++;
  19. traversal(root->left, p, result);
  20. traversal(root->right, p, result);
  21. }
  22. }
  1. class Solution {
  2. List r;
  3. Solution(){
  4. r = new ArrayList();
  5. }
  6. public List<Integer> preorderTraversal(TreeNode root) {
  7. trans(root);
  8. return r;
  9. }
  10. public void trans(TreeNode root){
  11. if(root != null){
  12. r.add(root.val);
  13. trans(root.left);
  14. trans(root.right);
  15. }
  16. }
  17. }

非递归遍历(中序)

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/

  1. int* inorderTraversal(struct TreeNode* root, int* returnSize){
  2. int* result = (int *)malloc(100 * sizeof(int));
  3. *returnSize = 0;
  4. Traversal(root, returnSize, result);
  5. return result;
  6. }
  7. void Traversal(struct TreeNode* root, int* p, int* result){
  8. struct TreeNode** stack[100] = {};
  9. int stackSize = 0;
  10. while(root || stackSize > 0){
  11. while(root){
  12. stack[stackSize] = root;
  13. stackSize++;
  14. root = root->left;
  15. }
  16. if(stackSize != 0){
  17. stackSize--;
  18. root = stack[stackSize];
  19. *(result + *p) = root->val;
  20. (*p)++;
  21. root = root->right;
  22. }
  23. }
  24. }
  1. class Solution {
  2. List l;
  3. Stack s;
  4. Solution(){
  5. l = new ArrayList();
  6. s = new Stack<TreeNode>();
  7. }
  8. public List<Integer> inorderTraversal(TreeNode root) {
  9. trans(root);
  10. return l;
  11. }
  12. public void trans(TreeNode root){
  13. while(root != null || !s.isEmpty()){
  14. while(root != null){
  15. s.add(root);
  16. root = root.left;
  17. }
  18. if(!s.isEmpty()){
  19. root = (TreeNode)s.pop();
  20. l.add(root.val);
  21. root = root.right;
  22. }
  23. }
  24. }
  25. }

非递归遍历(后序)

https://leetcode-cn.com/problems/binary-tree-postorder-traversal/

  1. int* postorderTraversal(struct TreeNode* root, int* returnSize){
  2. int* temp = malloc(100 * sizeof(int));
  3. *returnSize = 0;
  4. traversal(root, returnSize, temp);
  5. int* result = malloc(100 * sizeof(int));
  6. int count = *returnSize;
  7. int p = 0;
  8. while(count > 0){
  9. *(result + p) = *(temp + count - 1);
  10. count--;
  11. p++;
  12. }
  13. return result;
  14. }
  15. void traversal(struct TreeNode* root, int* returnSize, int* result){
  16. struct TreeNode** stack[100] = {};
  17. int p = 0; //栈中元素个数
  18. while(root || p != 0){
  19. while(root){
  20. stack[p] = root;
  21. p++;
  22. *(result + *returnSize) = root->val;
  23. (*returnSize)++;
  24. root = root->right;
  25. }
  26. if(p != 0){
  27. p--;
  28. root = stack[p];
  29. root = root->left;
  30. }
  31. }
  32. }
  1. /*使用两个堆栈,将根结点-右儿子-左儿子的顺序颠倒即为后续遍历
  2. 根结点-右儿子-左儿子的顺序只需简单改变非递归前序遍历*/
  3. class Solution {
  4. List l;
  5. Stack s;
  6. Stack r;
  7. Solution(){
  8. l = new ArrayList();
  9. s = new Stack<TreeNode>();
  10. r = new Stack<TreeNode>();
  11. }
  12. public List<Integer> postorderTraversal(TreeNode root) {
  13. trans(root);
  14. while(!r.isEmpty()){
  15. TreeNode temp = (TreeNode)r.pop();
  16. l.add(temp.val);
  17. }
  18. return l;
  19. }
  20. public void trans(TreeNode root){
  21. while(root != null || !s.isEmpty()){
  22. while(root != null){
  23. s.add(root);
  24. r.add(root);
  25. root = root.right;
  26. }
  27. if(!s.isEmpty()){
  28. root = (TreeNode)s.pop();
  29. root = root.left;
  30. }
  31. }
  32. }
  33. }

层序遍历

https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

  1. class Solution {
  2. Queue<TreeNode> q;
  3. ArrayList<List<Integer>> r;
  4. ArrayList<Integer> temp;
  5. Solution(){
  6. q = new LinkedList<TreeNode>();
  7. temp = new ArrayList<Integer>();
  8. r = new ArrayList<List<Integer>>();
  9. }
  10. public List<List<Integer>> levelOrder(TreeNode root) {
  11. int count = 0; //count为下一深度结点数量
  12. int cur = 1; //cur为当前深度剩余结点
  13. if(root == null)
  14. return r;
  15. q.add(root);
  16. while(!q.isEmpty()){
  17. cur--;
  18. root = q.remove();
  19. temp.add(root.val);
  20. if(root.left != null){
  21. q.add(root.left);
  22. count++;
  23. }
  24. if(root.right != null){
  25. q.add(root.right);
  26. count++;
  27. }
  28. if(cur == 0){
  29. //当前深度遍历完毕
  30. //list中保存的是temp的引用,由于后续要清空list的内容,需要进行深复制
  31. r.add((List<Integer>)temp.clone());
  32. temp.clear();
  33. cur = count;
  34. count = 0;
  35. }
  36. }
  37. return r;
  38. }
  39. }