Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3],
1
\
2
/
3
return [1,2,3].
Note: Recursive solution is trivial, could you do it iteratively?
递归 :
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<int> res; void backtrack(TreeNode* root) { if(root==nullptr) { return; } res.push_back(root->val); backtrack(root->left); backtrack(root->right); } vector<int> preorderTraversal(TreeNode* root) { backtrack(root); return res; } };
1 class Solution { 2 private List<Integer> res = new ArrayList<Integer>(); 3 public List<Integer> preorderTraversal(TreeNode root) { 4 help(root); 5 return res; 6 } 7 private void help(TreeNode root){ 8 if(root == null) return ; 9 res.add(root.val); 10 help(root.left); 11 help(root.right); 12 } 13 }
非递归:
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> stk; if(root != nullptr) stk.push(root); while(!stk.empty()) { TreeNode* currentnode = stk.top(); stk.pop(); res.push_back(currentnode->val); //至于为什么要右结点先入栈,是因为栈后进先出的特性。右结点先入栈,就会后输出右结点。 if (currentnode->right !=nullptr) stk.push(currentnode->right); if (currentnode->left != nullptr) stk.push(currentnode->left); } return res; } };
用stack 保存右节点跟左节点
1 class Solution { 2 public List<Integer> preorderTraversal(TreeNode root) { 3 List<Integer> res = new ArrayList<Integer>(); 4 Stack<TreeNode> stack = new Stack(); 5 stack.push(root); 6 while(!stack.isEmpty()){ 7 root = stack.pop(); 8 if (root!=null){ 9 res.add(root.val); 10 stack.push(root.right); 11 stack.push(root.left); 12 } 13 } 14 return res; 15 } 16 }