1. 程式人生 > 其它 >樹相關演算法C++實現

樹相關演算法C++實現

樹遍歷方法大全

void fun(TreeNode* root) {
    if (!root)return;
    cout << root->val<<',';
    fun(root->left);
    fun(root->right);
}//遞迴先序遍歷,中序、後序遍歷同理
void fun(TreeNode* root) {
    queue<TreeNode*> tmp;
    tmp.push(root);
    while (!tmp.empty()) {
        TreeNode* x = tmp.front();
        if(x->left)tmp.push(x->left);
        if (x->right)tmp.push(x->right);
        cout << x->val << ' ';
        tmp.pop();
    }
}//層序遍歷
void fun(TreeNode* root) {
    stack<TreeNode*> tmp;
    while (!tmp.empty()||root) {
        while (root) {
            tmp.push(root);
            root = root->left;
        }
        root = tmp.top();       
        tmp.pop();
		cout << root->val << ' ';
        root = root->right;
    }   
}//非遞迴中序遍歷,利用棧
void fun(TreeNode* root) {
    stack<TreeNode*> tmp;
    while (!tmp.empty()||root) {
        while (root) {
            tmp.push(root);
          	cout << root->val << ' ';
            root = root->left;
        }
        root = tmp.top();       
        tmp.pop();
        root = root->right;
    }   
}//和非遞迴中序遍歷比僅更改列印位置
void trifun(TreeNode *root){
    stack<pair<TreeNode *,bool>> s;
    s.push(make_pair(root, false));
    bool visited;
    while(!s.empty()){
        root = s.top().first;
        visited = s.top().second;
        s.pop();
        if(root == NULL)continue;
        if(visited)cout<<root->val<<' ';
        else{
            s.push(make_pair(root, true));
            s.push(make_pair(root->right, false));
            s.push(make_pair(root->left, false));//後序遍歷,壓棧順序與自然順序相反,為中->右->左
        }
    }
}//樹三種非遞迴遍歷的改版

一個二叉樹遞迴的經典問題

題目:輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一 直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 思路分析: (1)首先該題是基於遞迴去遍歷整棵樹,遍歷完每一條路徑,遍歷的順序是先根節點,然後是左節點,接著是右節點; (2)如果節點的左右子樹都為空,且路徑之和等於引數,就說明該路徑是需要輸出的 (3)如果不滿足條件,在遍歷完之後需要把最後一顆節點彈出來。
class Solution {
private:
	vector<vector<int>>ret;
	vector<int>temp;
public:
    void def(TreeNode* root,int expectNumber){
        temp.push_back(root->val);
        if(expectNumber - root->val ==0 &&root->left == NULL &&root->right== NULL)ret.push_back(temp);
        else{
            if(root->left != NULL)def(root->left,expectNumber - root->val);
            if(root->right != NULL)def(root->right,expectNumber - root->val);
        }
        temp.pop_back();
    }
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        if(root == NULL)return ret;
        def(root,expectNumber);
        return ret;
    }  
};