找到二叉树全部叶子节点的路径

找到二叉树全部叶子节点的路径


image-20221026213123005

描述:根据图示二叉树来找到全部子叶节点的路径。


解决方案:递归+回溯

采用前序遍历恰好可以得到A->B->C的输出。

当没有遍历到子叶节点时 递归向下搜索 类似于 DFS(深度优先搜索)

每当找到子叶节点时 可以选择输出结果到容器中 介于数据结构是c语言实现,我们可以自己动手写一个Vector容器

目的是完成作业:所以该容器属于定制化,不需要太多功能也不用泛型。

/*
* 重写一个char数组容器
*/
struct Vector {
	char* Data;
	int Maxsize;
	int currentSize;
	/*
	* 容器的默认构造方法
	*/
	Vector() {
		Maxsize = 10;
		Data = (char*)malloc(sizeof(int) * Maxsize);
		currentSize = -1;
	}
	/*
	* 向容器中尾插数据
	*/
	void push_back(char x) {
		// 数组已经满了,自动扩充数组
		if (currentSize + 1 == Maxsize) {
			resize();
		}
		Data[++currentSize] = x;
	}
	/*
	* 尾删法 删除容器最后一个数值 
	* 只实现逻辑删除
	*/
	void pop_back() {
		if (currentSize != -1) {
			currentSize--;
		}
	}
	/*
	* 重载运算符实现下标的方式访问
	* TODO 未处理下标越界情况
	*/
	char operator[](int x) {
		if (x <= currentSize) {
			return Data[x];
		}
	}
	void resize() {
		Maxsize += 10;
		//重新拷贝一份空间复制
		char* temp = (char*)malloc(sizeof(char) * Maxsize);
		for (int i = 0; i < currentSize; i++) {
			temp[i] = Data[i];
		}
		Data = temp;
	}
};

值得注意的是 我传入的vector是传入引用 这样可以更加清楚的展现递归和回溯过程。

先序遍历过程是隐含的 每次都先把这个root先存入 这样也可以防止最后结果中不含叶节点。

为了理解 建议大家亲手写一下递归和回溯的过程

image-20221026214042519

posted @ 2022-10-26 21:56  程序员包子  阅读(101)  评论(0编辑  收藏  举报