【编程练习】二叉树重点算法(一)

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

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