LeetCode094 Binary Tree Inorder Traversal

详细见:leetcode.com/problems/binary-tree-inorder-traversal


Java Solution: github

package leetcode;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;

import tools.TreeNode辅助.TreeNode;;

/*
 * 	Given a binary tree, return the inorder traversal of its nodes' values.

	For example:
	Given binary tree [1,null,2,3],
	   1
	    \
	     2
	    /
	   3
	return [1,3,2].	
 */


public class P094_BinaryTreeInorderTraversal {
	public static void main(String[] args) {
		TreeNode t0 = new TreeNode(0);
		TreeNode t1 = new TreeNode(1);
		TreeNode t2 = new TreeNode(2);
		TreeNode t3 = new TreeNode(3);
		TreeNode t4 = new TreeNode(4);
		TreeNode t5 = new TreeNode(5);
		TreeNode t6 = new TreeNode(6);
		t0.left = t1;
		t0.right = t2;
		t1.left = t3;
		t1.right = t4;
		t2.left = t5;
		t2.right = t6;
		List<Integer> ans = new Solution6().inorderTraversal(t0);
		tools.Utils.B_打印List_Integer(ans);
	}
	/*
	 * 	AC
	 * 	0 ms
	 * 	这个时候递归版本
	 */
	static class Solution1 {
		List<Integer> ans = new LinkedList<Integer>();
	    public List<Integer> inorderTraversal(TreeNode root) {
	    	in(root);
	        return ans;
	    }
	    void in(TreeNode root) {
	    	if (root == null) {
	    		return;
	    	}
	    	in(root.left);
	    	ans.add(root.val);
	    	in(root.right);
	    }
	}
	/*
	 * 	写了一个层序遍历
	 */
	static class Solution2 {
		List<Integer> ans = new LinkedList<Integer>();
    	Queue<TreeNode> queue = new LinkedList<TreeNode>();
	    public List<Integer> inorderTraversal(TreeNode root) {
	    	if (root == null) {
	    		return ans;
	    	}
	    	queue.add(root);
	    	while (! queue.isEmpty()) {
	    		TreeNode root_now = queue.poll();
	    		ans.add(root_now.val);
	    		if (root_now.left != null) {
	    			queue.add(root_now.left);
	    		}
	    		if (root_now.right != null) {
		    		queue.add(root_now.right);
	    		}
	    	}
	        return ans;
	    }
	}
	/*
	 * 	写了一个先序遍历
	 */
	static class Solution3 {
		List<Integer> ans = new LinkedList<>();
		public List<Integer> inorderTraversal(TreeNode root) {
			if (root == null) {
				return ans;
			}
			Stack<TreeNode> stack = new Stack<>();
			stack.push(root);
			while (! stack.isEmpty()) {
				TreeNode root_now = stack.pop();
				ans.add(root_now.val);
				if (root_now.right != null) {
					stack.push(root_now.right);
				}
				if (root_now.left != null) {
					stack.push(root_now.left);
				}
			}
			return ans;
		}
	}
	/*
	 * 	写了一个后序遍历
	 */
	static class Solution4 {
		List<Integer> ans = new LinkedList<>();
		public List<Integer> inorderTraversal(TreeNode root) {
			if (root == null) {
				return ans;
			}
			Stack<TreeNode> stack = new Stack<>();
			stack.push(root);
			while (! stack.isEmpty()) {
				TreeNode root_now = stack.peek();
				if (null != root_now.left && root != root_now.left && root != root_now.right) {
					stack.push(root_now.left);
				} else if (null != root_now.right && root != root_now.right) {
					stack.push(root_now.right);
				} else {
					ans.add(stack.pop().val);
					root = root_now;
				}
			}
			return ans;
		}
	}
	/*
	 * 	写了一个后序遍历
	 */
	static class Solution5 {
		List<Integer> ans = new LinkedList<>();
		public List<Integer> inorderTraversal(TreeNode root) {
			if (null == root) {
				return ans;
			}
			Stack<TreeNode> stack1 = new Stack<>();
			Stack<TreeNode> stack2 = new Stack<>();
			stack1.push(root);
			while (! stack1.isEmpty()) {
				TreeNode root_now = stack1.pop();
				stack2.push(root_now);
				if (null != root_now.left) {
					stack1.push(root_now.left);
				}
				if (null != root_now.right) {
					stack1.push(root_now.right);
				}
			}
			while (! stack2.isEmpty()) {
				ans.add(stack2.pop().val);
			}
			return ans;
		}
	}
	/*
	 * 	写了一个中序遍历
	 */
	static class Solution6 {
		List<Integer> ans = new LinkedList<Integer>();
		public List<Integer> inorderTraversal(TreeNode root) {
			if (null == root) {
				return ans;
			}
			Stack<TreeNode> stack = new Stack<TreeNode>();
			while (! stack.isEmpty() || root != null) {
				if (null != root) {
					stack.push(root);
					root = root.left;
				} else {
					root = stack.pop();
					ans.add(root.val);
					root = root.right;
				}
			}
			return ans;
		}
	}
}


C Solution: github

/*
    url: leetcode.com/problems/binary-tree-inorder-traversal
    in_order:          AC 3ms 0.00%
    in_order_unrecur:  AC 0ms 62.86%
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode stn;
typedef struct TreeNode * ptn;

typedef int T;
typedef struct al sal;
typedef struct al * pal;

struct al {
    int capacity;
    int size;
    T* arr;
};

pal al_init(int capacity) {
    pal l = (pal) malloc(sizeof(sal));
    if (capacity < 1) return NULL;
    l->arr = (T*) malloc(sizeof(T) * capacity);
    l->capacity = capacity;
    l->size = 0;
    return l;
}

void al_expand_capacity(pal l) {
    T* new_arr = (T*) malloc(sizeof(T) * (l->capacity * 2 + 1));
    int i = 0;
    for (i = 0; i < l->capacity; i ++)
        new_arr[i] = l->arr[i];
    free(l->arr);
    l->arr = new_arr;
    l->capacity = l->capacity * 2 + 1;
}

void al_add_last(pal l, T v) {
    if (l->capacity == l->size) al_expand_capacity(l);
    l->arr[l->size] = v;
    l->size ++;
}

T* al_convert_to_array_free_l(pal l) {
    T* arr = l->arr;
    free(l);
    return arr;
}

struct TreeNode {
    int val;
    ptn left;
    ptn right;
};

void in_order(ptn root, pal l) {
    if (root == NULL) return;
    in_order(root->left, l);
    al_add_last(l, root->val);
    in_order(root->right, l);
}

//element type
typedef ptn V;
typedef struct dll sdll;
typedef struct dll * pdll;
typedef struct dln sdln;
typedef struct dln * pdln;


//doubly list node
struct dln {
    V val;
    pdln pre;
    pdln nxt;
};

//doubly linked list
struct dll {
    pdln first;
    pdln last;
    int size;
};

pdll dll_init() {
    pdll l = (pdll) malloc(sizeof(sdll));
    l->first = NULL;
    l->last = NULL;
    l->size = 0;
    return l;
}

void dll_add_last(pdll l, V v) {
    pdln t = (pdln) malloc(sizeof(sdln));
    t->val = v;
    t->pre = NULL;
    t->nxt = NULL;
    if (l->size == 0) {
        l->first = t;
        l->last = t;
        l->size = 1;
        return;
    }
    t->pre = l->last;
    l->last->nxt = t;
    l->last = t;
    l->size ++;
}

void dll_remove_last(pdll l) {
    pdln t = NULL;
    if (l->last == NULL) return;
    if (l->first == l->last) {
        free(l->first);
        l->first = NULL;
        l->last = NULL;
        l->size = 0;
        return;
    }
    t = l->last->pre;
    t->nxt = NULL;
    free(l->last);
    l->last = t;
    l->size --;
}

void dll_free_all(pdll l) {
    pdln t1 = l->first, t2 = NULL;
    while (t1 != NULL) {
        t2 = t1->nxt;
        free(t1);
        t1 = t2;
    }
    free(l);
}

void in_order_unrecur(ptn root, pal l) {
    pdll q = dll_init();
    ptn now = root;
    while (1) {
        if (q->size == 0 && now == NULL) break;
        if (now == NULL) {
            now = q->last->val;
            dll_remove_last(q);
            al_add_last(l, now->val);
            now = now->right;
        } else {
            dll_add_last(q, now);
            now = now->left;
        }
    }
    dll_free_all(q);
}

int* inorderTraversal(ptn root, int* rn) {
    pal l = al_init(16);
    //in_order(root, l);
    in_order_unrecur(root, l);
    *rn = l->size;
    return al_convert_to_array_free_l(l);
}


Python Solution: github

#coding=utf-8

'''
    url: leetcode.com/problems/binary-tree-inorder-traversal
    @author:     zxwtry
    @email:      zxwtry@qq.com
    @date:       2017年4月24日
    @details:    Solution: 42ms 63.63%
    @details:    SolutionUnRecur: 52ms 24.22%
'''

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution(object):
    def inOrder(self, root, a):
        if (root == None): return
        self.inOrder(root.left, a)
        a.append(root.val)
        self.inOrder(root.right, a)

    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        a = []
        self.inOrder(root, a)
        return a
    
class SolutionUnRecur(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        a, s, h = [], [], root
        while (True):
            if len(s) == 0 and h == None: break
            if h == None:
                h = s.pop()
                a.append(h.val)
                h = h.right
            else:
                s.append(h)
                h = h.left        
        return a


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值