精华内容
下载资源
问答
  • BinaryTreeNode removeleaf(BinaryTreeNode root){ if(root == null){ return null; } if(root.getLeft() == null && root.getRight() == null){ return null; ... root.setLeft(root.getLeft());...
    BinaryTreeNode removeleaf(BinaryTreeNode root){
      if(root == null){
        return null;
      }
      if(root.getLeft() == null && root.getRight() == null){
        return null;
      }else{
         root.setLeft(root.getLeft());
      root.setRight(root.getRight()); 
      }
      return root;
    }
    
    展开全文
  • 删除二叉树所有叶子节点

    千次阅读 2020-05-02 19:16:44
    //删除二叉树中所有叶子节点 void DeleteLev(BiTree T,BiTree f,bool flag){ if(T){//T is not NULL if(T->l){ DeleteLev(T->l,T,true); } if(T->r){ DeleteLev(...
    //删除二叉树中的所有叶子节点
    void DeleteLev(BiTree T,BiTree f,bool flag){
        if(T){//T is not NULL
            if(T->l){
                DeleteLev(T->l,T,true);
            }
            if(T->r){
                DeleteLev(T->r,T,false);
            }else{//T is a level node
                free(T);
                if(f){// T is not root
                    if(flag)f->l = NULL;
                    else f->r = NULL;
                }
                
            }
        }
    }
    
    void main(){
        Init(T);
        DeleteLev(T,NULL,true);
    }
    
    展开全文
  • void Del(BitNode *&p){ if(pnull)return; else if(p->lchildnull&&p->rchild==null){ free(p); p=null; } else{ Del(p->lchild); Del(p->rchild); ...}

    void Del(BitNode *&p){
    if(pnull)return;
    else if(p->lchild
    null&&p->rchild==null){
    free(p);
    p=null;
    }
    else{
    Del(p->lchild);
    Del(p->rchild);
    }
    }

    展开全文
  • 二叉树的最大叶子节点距离(递归)

    千次阅读 2017-03-02 12:45:39
    按照先序遍历的方式输入一颗二叉树序列构建一棵二叉树,然后按照后序遍历的方式输出每一个节点,以验证构建的二叉树的正确性。再求出这课二叉树中最大的叶子结点距离.最后按后序遍历的方式删除二叉树

    题目: 输入一颗二叉树先序遍历的字符串,输出该二叉树的最大叶子节点距离


    思路:先定义一个表示最大叶子节点距离的全局变量,然后按照后续遍历的方法访问每一个节点,

    在遍历的过程中全局变量随时更新为目前出现的最大节点距离。当访问完根节点后,全局变量里

    的值即为最大叶节点距离。



    节点类型定义如下:

    struct BTNode
    {
    	char key;
    	BTNode* lchild, *rchild;
    	int maxLeftDepth;
    	int maxRightDepth;
    	BTNode(char val) :key(val), lchild(NULL), rchild(NULL), maxLeftDepth(0), maxRightDepth(0) {};
    };


    //存储最大叶子节点距离的全局变量

    int maxDepth = 0;


    //按照先序遍历的顺序输入一棵二叉树的所有节点,#代表空节点,创建一颗二叉树

    void createTree(BTNode*& root)
    {
    	char val = getchar();
    	if (val == '#')
    	{
    		root = NULL;
    		return;
    	}
    	else
    	{
    		if (root == NULL)
    		{
    			root = new BTNode(val);
    			createTree(root->lchild);
    			createTree(root->rchild);
    		}
    	}
    }



    //后序遍历输出二叉树所有节点,验证上面建立的二叉树是否正确

    void PostOrderTraversal(BTNode* root)
    {
    	if (root == NULL)
    		return;
    	PostOrderTraversal(root->lchild);
    	PostOrderTraversal(root->rchild);
    	cout << root->key << " ";
    }


    //查找最大叶子节点距离

    void maxLeafDistance(BTNode* root)
    {
    	if (root == NULL)
    		return ;
    
    	//先访问左孩子节点
    	if (root->lchild == NULL)
    		root->maxLeftDepth = 0;
    	if (root->lchild != NULL)
    		maxLeafDistance(root->lchild);
    
    	//再访问右孩子节点
    	if (root->rchild == NULL)
    		root->maxRightDepth = 0;
    	if (root->rchild != NULL)
    		maxLeafDistance(root->rchild);
    	
    	//最后访问根节点
    	if (root->lchild)
    	{
    		int maxLeftDepOfRt = ((root->lchild->maxLeftDepth > root->lchild->maxRightDepth) ? root->lchild->maxLeftDepth + 1 :
    			root->lchild->maxRightDepth + 1);
    		root->maxLeftDepth = maxLeftDepOfRt;
    	}
    	if (root->rchild)
    	{
    		int maxRightDepOfRt = (root->rchild->maxLeftDepth > root->rchild->maxRightDepth) ? root->rchild->maxLeftDepth + 1 :
    			root->rchild->maxRightDepth + 1;
    		root->maxRightDepth = maxRightDepOfRt;
    	}
    
    	//访问完根节点后依据需要更新代表最大叶子节点距离的全局变量
    	if (root->maxLeftDepth + root->maxRightDepth >maxDepth)
    	{
    		maxDepth = root->maxLeftDepth + root->maxRightDepth;
    	}
    	return ;
    }


    //按后序遍历的方式依次删除二叉树的每一个节点

    void destroyTree(BTNode*& root)
    {
    	if (root != NULL)
    	{
    		if (root->lchild == NULL && root->rchild == NULL)
    		{
    			cout << "删除" << root->key << "节点" << endl;
    			delete root;
    			root = NULL;
    			return;
    		}
    		destroyTree(root->lchild);
    		destroyTree(root->rchild);
    		cout << "删除" << root->key << "节点" << endl;
    		delete root;
    		root = NULL;
    	}
    	else
    		return;
    }


    //main函数

    int main()
    {
    	BTNode* root = NULL;
    	cout << "请按先序遍历顺序输入一颗二叉树,#代表空节点: ";
    	createTree(root);
    	cout << "建立的二叉树的后序遍历顺序为: ";
    	PostOrderTraversal(root);
    	cout << endl;
    	maxLeafDistance(root);
    	cout << "构造的二叉树中最大叶子节点距离为: " << maxDepth << endl;
    
    	destroyTree(root);
    	return 0;
    }







    整理一下全部的代码:

    #include<iostream>
    using namespace std;
    
    struct BTNode
    {
    	char key;
    	BTNode* lchild, *rchild;
    	int maxLeftDepth;
    	int maxRightDepth;
    	BTNode(char val) :key(val), lchild(NULL), rchild(NULL), maxLeftDepth(0), maxRightDepth(0) {};
    };
    
    int maxDepth = 0;//代表最大叶子节点距离的全局变量
    
    void createTree(BTNode*& root)
    {
    	char val = getchar();
    	if (val == '#')
    	{
    		root = NULL;
    		return;
    	}
    	else
    	{
    		if (root == NULL)
    		{
    			root = new BTNode(val);
    			createTree(root->lchild);
    			createTree(root->rchild);
    		}
    	}
    }
    
    void PostorderTraversal(BTNode* root)
    {
    	if (root == NULL)
    		return;
    	PostorderTraversal(root->lchild);
    	PostorderTraversal(root->rchild);
    	cout << root->key << " ";
    }
    
    void maxLeafDistance(BTNode* root)
    {
    	if (root == NULL)
    		return ;
    
    	//先访问左孩子节点
    	if (root->lchild == NULL)
    		root->maxLeftDepth = 0;
    	if (root->lchild != NULL)
    		maxLeafDistance(root->lchild);
    
    	//再访问右孩子节点
    	if (root->rchild == NULL)
    		root->maxRightDepth = 0;
    	if (root->rchild != NULL)
    		maxLeafDistance(root->rchild);
    	
    	//最后访问根节点
    	if (root->lchild)
    	{
    		int maxLeftDepOfRt = ((root->lchild->maxLeftDepth > root->lchild->maxRightDepth) ? root->lchild->maxLeftDepth + 1 :
    			root->lchild->maxRightDepth + 1);
    		root->maxLeftDepth = maxLeftDepOfRt;
    	}
    	if (root->rchild)
    	{
    		int maxRightDepOfRt = (root->rchild->maxLeftDepth > root->rchild->maxRightDepth) ? root->rchild->maxLeftDepth + 1 :
    			root->rchild->maxRightDepth + 1;
    		root->maxRightDepth = maxRightDepOfRt;
    	}
    
    	//访问完根节点后依据需要更新代表最大叶子节点距离的全局变量
    	if (root->maxLeftDepth + root->maxRightDepth >maxDepth)
    	{
    		maxDepth = root->maxLeftDepth + root->maxRightDepth;
    	}
    	return ;
    }
    
    void destroyTree(BTNode*& root)
    {
    	if (root != NULL)
    	{
    		if (root->lchild == NULL && root->rchild == NULL)
    		{
    			cout << "删除" << root->key << "节点" << endl;
    			delete root;
    			root = NULL;
    			return;
    		}
    		destroyTree(root->lchild);
    		destroyTree(root->rchild);
    		cout << "删除" << root->key << "节点" << endl;
    		delete root;
    		root = NULL;
    	}
    	else
    		return;
    }
    
    int main()
    {
    	BTNode* root = NULL;
    	cout << "请按先序遍历顺序输入一颗二叉树,#代表空节点: ";
    	createTree(root);
    	cout << "建立的二叉树的后序遍历顺序为: ";
    	PostorderTraversal(root);
    	cout << endl;
    	maxLeafDistance(root);
    	cout << "构造的二叉树中最大叶子节点距离为: " << maxDepth << endl;
    
    	destroyTree(root);
    	return 0;
    }




     
    

    测试用例1:
    FGHA###M##JK#B##L##

    构建的二叉树如下图所示:

    知红色路径上的两个叶子节点为最大距离叶子节点,距离为6。


    运行结果如下图所示:

    从上图可以看到运行结果正确,说明程序编码无误。




    测试用例2:A#BCEG####DF#H###

    构建的二叉树如下图所示:

    知红色路径上的两个叶子节点为最大距离叶子节点,距离为6。


    运行结果如下图所示:


    从上图可以看到运行结果正确,说明程序编码无误。


    展开全文
  • #include #include using namespace std; template class BinaryTreeNode{ public: ... cout 删除叶子结点后的二叉树先序序列为:" ; t->deletelea(root,pre); t->preOrder(root); return 0; }  
  • 如果是偶数个节点,叶子节点等于总节点除以2, 即 N % 2==0, n = N/2 如果是奇数个叶子节点等于(总节点+1)除以2, 即 N % 2 == 1, n = (N+1)/2 即向上取整。 推导可参考:...
  • 删除二叉树中度为0的结点(即叶子结点)
  • void deletLeaf(BTree root) {     if (!root)  {   return;  }   if ((root->left == NULL)&&(root->right == NULL))  {  root->data = 0;   return;
  • 二叉树:在一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上。 完全二叉树:如果一颗具有N个结点二叉树的结构与二叉树的前N个结点的结构相同,称为完全二叉树二叉树的...
  • 假定二叉树采用二叉树存储结构,设计一个算法,删除二叉树全部结点(不是叶子结点
  • (1)建立二叉树的二叉链表。 (2)写出对用二叉链表存储的二叉树进行先序、中序...(4)求二叉树所有叶子结点总数。 include #include #define N 20 #define SIZE 100 #define MORE 10 typedef struct BiTNode{ ch
  • 标签:树、二叉树、深度优先搜索 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(N)O(N)O(N) O(N)O(N)O(N) 68ms (58.44%) Ans 2 (Python) Ans 3 (Python) 解法一: class Solution: ...
  • 依次从左到右,每次收集并删除所有叶子节点 重复如上过程直到整棵树为空 示例: 输入: [1,2,3,4,5] 输出: [[4,5,3],[2],[1]] 解释: 删除叶子节点 [4,5,3] ,得到如下树结构: 1 / 2 现在删去叶子节点 [2...
  • 剪掉二叉树叶子节点

    2016-01-04 21:41:56
    Time Limit: 1sec Memory Limit:...实现下述函数,剪去非空二叉树中所有叶子节点void cutLeaves(BinaryNode* &root)given the following definition:typedef int T; struct BinaryNode{ T data; //store data Bi
  • // 二叉树的遍历与应用算法的设计与实现.cpp : 定义控制台应用...printf("\n二叉树中叶子结点的个数:%d\n", T); CountLeaf(T); printf("\n左右子树交换:%d\n", T); Exchange(T, PrintElement); system("pause"); }
  • 依次从左到右,每次收集并删除所有叶子节点 重复如上过程直到整棵树为空 示例: 输入: [1,2,3,4,5] 1 / \ 2 3 / \ 4 5 输出: [[4,5,3],[2],[1]] 解释: 1. 删除叶子节点 [4,5,3] ,得到如下树结构: ...
  • 删除二叉树所有节点

    千次阅读 2017-11-10 16:48:41
    需要记录t的父节点void delete(bitree &t,binode *p){//p初始为空 if(t==null) return ; if(t->lchild==null&&t->rchlid==null) {//如果为叶节点 if(p=null) //该树只有根节点 free(t); else { free(t); p->...
  • 假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中叶子结点数,并设计主函数调用上述算法。 #include<iostream>//蓝多多算法实验五:二叉树的应用(二) #include<stdio.h> #include<...
  • 实际的应用题。 已知完全二叉树的第7层有20个结点,则整个完全二叉树叶子结点数为
  • 二叉树计算叶子节点算法,时间复杂度。 自然语言描述:采用递归算法,先序遍历二叉树的每一个结点,如果结点没有左子树和右子树,则叶子结点个数加一。 Python代码实现: def CountOfLeaf(count=0, bitree:BiTree): ...
  • 第一种删除叶子节点() 思路: 1.找到要删除的叶子 2.找到叶子的父节点parent 3.判断叶子是parent的左子节点还是右子节点4根据前面的情况对应删除 左子节点 parent.left=null 右子节点 parent.lright=null 第二种...
  • 二叉树叶子结点删除 之前我认为的是,只要free()掉叶子结点就可以了,但是为了避免野指针的出现,我们还需要将指向叶子结点的双亲的左右指针置为NULL! 代码 void Del_0(BiTree T) //删除叶子结点 { BiTNode *p =...
  • java语言实现的二叉树的各种操作(包括递归与非递归遍历二叉树,求二叉树的高度,节点总数,叶子节点等)
  • 450.删除二叉树中节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可...
  • 也就是刚遍历过的子节点删除,当发现正在遍历的节点没有子节点的时候,就说明走到了叶子节点位置,arrayListSingle里存的就正好是一条从根节点到该叶子的路径,这时就将arrayListSingle里的路径以String形式存到最终...
  • 二叉树中删去所有结点

    千次阅读 多人点赞 2019-10-23 21:53:22
    删除所有叶子结点 void Del_0(BiTree T) //删除叶子结点 { BiTNode *p = T; if (p == NULL) return; else if (p->lchild == NULL && p->rchild == NULL) free(p); Del_0(T->lchild...
  • 二叉树中删除一个节点

    万次阅读 2014-06-15 23:06:34
    1.被删除的节点是叶子节点 2.被删除的节点只有左孩子节点 3.被删除的节点只有右孩子节点 4.被删除的有两个孩子节点   所以在删除的时候,这4种情况都必须考虑进去,并且这4情况之下,还会有细的划分,下面就细说...
  • 二叉树-删除指定节点

    2020-08-26 09:50:45
    删除的节点是叶子节点,则删除该节点 若删除的节点是非叶子节点,则删除该子树 删除节点的方法写的不是怎么好,不能删除根节点,看来是递归这里还是不够明了,求道友们推荐写递归和二叉树的文章 删除思路分析 /** ...
  • 数据结构实验之二叉树七:叶子问题 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss ...请建立该二叉树并按从上到下从左到右的顺序输出该二叉树所有叶子结点。 Input  输入数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,509
精华内容 16,203
关键字:

删除二叉树中所有叶子节点