【編程練習】二叉樹重點算法(一)

1、二叉樹的分層遍歷(寬度優先搜索)
2、從上往下打印出二叉樹的每個節點,同層節點從左至右打印
這個和第一題基本相同,依靠vector保存訪問,queue隊列實現遍歷

vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int>  que;
        queue<TreeNode*>q;
        TreeNode* fr;
        if(root == NULL) return que;
        q.push(root);
        while(!q.empty())
        {
            fr=q.front();
            que.push_back(fr->val);
            if(fr->left != NULL)
                q.push(fr->left);
            if(fr->right != NULL)
                q.push(fr->right);
            q.pop();
        }
        return que;
    }

3、二叉樹的前序遍歷(深度優先搜索)

void preTravel(TreeNode root)
{
	if(root==NULL)
		return;
	stack<TreddNode>s;
	s.push(root);
	while(!s.empty())
	{
		TreeNode cur=s.top();
		s.pop();
		cout<<"visited "<<cur.val<<endl;
		if(cur.right!=null)
			s.push(cur.right);
		if(cur.left!=null)
			s.push(cur.left);
	}
}

這裏壓入棧中的順序要注意是先右後左,因爲後進的先出。

4、給一個二叉樹,展開爲鏈表

void flatten(TreeNode root)
{
	if(!root)
		return;
	if(root->left)
		flatten(root->left);
	if(root->right)
		flatten(root->right);
	TreeNode *tmp=root->right;
	root->right=root->left;
	root->left=NULL;
	while(root->right)
		root=root->right;
	root->right=tmp;
}

5二叉樹的下一個
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。

TreeLinkNode* GetNext(TreeLinkNode* p)
    {
    	//該節點有右子樹,則右子樹中最左面的是下一個結點
         if(p->right)
         {
            p = p->right;
            while(p->left) p = p->left;
            return p;
        }
        //如果當前節點沒有右子樹,則一直向上找到第一個有右兒子的節點,該節點下一個就是後繼。
        while(p->next && p == p->next->right) p = p->next;
        return p->next;
    }

6 寫出中序遍歷的非遞歸算法

藉助棧,可以將二叉樹的遞歸算法轉換爲非遞歸算法,中序遍歷先掃描根節點的所有左節點,將它們一一進棧,然後出棧一個p訪問它,掃描該節點的右子樹,將其進棧,再掃描這個右子樹中的所有左節點,如此繼續直到棧空,出棧順序就是 (左-根-右)

void InOrder2(BiTress T)
{
	stack<BiTress>s;
	BiTree p=T;
	while(p||!s.(empty))
	{
		if(p)
		{
			s.push(p);
			p=p->lchild;
		}
		else
		{
			p=s.top();
			s.pop();
			visit(p);
			p=p->rchild;
		}
	}
}

時間限制:1秒 空間限制:32768K 熱度指數:221766
本題知識點: 棧 樹

題目描述
給定一棵二叉搜索樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值爲4。

class Solution {
public:
    int count=0;
    TreeNode* KthNode(TreeNode* pRoot, int k)
    {
        if (pRoot != NULL)
        {
            TreeNode* node= KthNode(pRoot->left,k);
            if (node != NULL) 
                return node;
            count++;
            if (count == k)
                return pRoot;
            node= KthNode(pRoot->right,k);
            if (node != NULL) 
                return node;
        }
        return NULL;
    }
    
};

後續更新在這裏
https://blog.csdn.net/weixin_44611644/article/details/97104367

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章