树的前中后序非递归遍历

非递归遍历统一用栈处理

1.前

    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();                       // 中
            st.pop();
            result.push_back(node->val);
            if (node->right) st.push(node->right);           // 右(空节点不入栈)
            if (node->left) st.push(node->left);             // 左(空节点不入栈)
        }
        return result;
    }

2.中

2.1记住按左中右的逻辑

借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素

    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while (cur != NULL || !st.empty()) {
            if (cur != NULL) { // 指针来访问节点,访问到最底层
                st.push(cur); // 将访问的节点放进栈
                cur = cur->left;                // 左
            } else {
                cur = st.top(); // 从栈里弹出的数据,就是要处理的数据(放进result数组里的数据)
                st.pop();
                result.push_back(cur->val);     // 中
                cur = cur->right;               // 右
            }
        }
        return result;
    }

3.后

3.1 利用前序的代码 后反转数组是

image.png

vector<int> preorderTraversal(TreeNode* root) {
	stack<TreeNode*> st;
	vector<int> result;
	if (root == NULL) return result;
	st.push(root);
	while (!st.empty()) {
		TreeNode* node = st.top();                       
		st.pop();
		result.push_back(node->val);
		if (node->left) st.push(node->left);
		if (node->right) st.push(node->right);                   
	}
	return reverse(result); // 前序改成中右左后倒转
}
void orderTraversal(BTree* root) // 王道版本
{
	Stack<BTree*> S;
	BTree* p = root,r;
	while(p || !S.empty())
	{
		if(p)
		{
			push(p);
			p = p->left;  
		}
		else{
			p = S.top();
			if(p->right != null && p->right != r)
				 p = p->right;
			else
			{
				p = S.pop();
				visit(p);
				r = p;
				p = null;
			}
		}
	}

}